6 Context Dependency Injection 1 1 m6 Slides
6 Context Dependency Injection 1 1 m6 Slides
and
Service Tier Together
Antonio Goncalves
www.antoniogoncalves.org
@agoncal
Module Outline
Java EE architectural styles
Java
Expression Language
Binding
EL name on beans
@Named
State management
Scopes and contexts
Java EE Tiered Architectures
Java for the Service Tier
@Named
public class PurchaseOrderBean {
@Named
public class PurchaseOrderBean {
@Named
public class PurchaseOrderBean {
@SessionScoped
private Float subtotal; @Named
public class UserBean {
public String compute() {...} public String login;
}
}
CDI to Manage State
<h:inputText value="#{userBean.login}"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:commandButton value="Compute" action='#{purchaseOrderBean.compute}'/>
@RequestScoped
@Named
public class PurchaseOrderBean {
@SessionScoped
private Float subtotal; @Named
public class UserBean {
public String compute() {...} public String login;
}
}
Binding
#
@Named qualifier
EL expression
Expression Language
// Value Expressions
#{purchaseOrderBean.subtotal}
#{purchaseOrderBean.customer.name}
// Array Expressions
#{purchaseOrderBean.orders[2]}
// Method Expressions
#{purchaseOrderBean.compute}
<h:outputLabel value="Sub-total:"/>
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:outputLabel value="Vat rate:"/>
<h:inputText value="#{purchaseOrderBean.vatRate}"/>
<h:commandLink value="Compute"
action='#{purchaseOrderBean.compute}'/>
</h:form>
</h:body>
</html>
CDI Bean
@Named
public class PurchaseOrderBean {
<h:inputText value="#{purchaseOrderBean.subtotal}"/>
<h:inputText value="#{purchaseOrderBean.vatRate}"/>
<h:commandLink action='#{purchaseOrderBean.compute}'/>
@Named
@Named("order")
public class PurchaseOrderBean {
<h:inputText value="#{order.subtotal}"/>
<h:inputText value="#{order.vatRate}"/>
<h:commandLink action='#{order.compute}'/>
Producers and Alternatives
@Named on a bean
<h:inputText value="#{vatRate}"/>
<h:inputText value="#{discountRate}"/>
Naming a Producer
public class NumberProducer {
<h:inputText value="#{vat}"/>
<h:inputText value="#{discountRate}"/>
Naming a Producer
public class NumberProducer {
<h:inputText value="#{vat}"/>
<h:inputText value="#{discount}"/>
Alternative Named Producer
public class NumberProducer {
<h:inputText value="#{vat}"/>
<h:inputText value="#{discount}"/>
Enabling the Alternative
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
version="1.1" bean-discovery-mode="all">
<alternatives>
<class>com.pluralsight.NumberProducer</class>
</alternatives>
</beans>
State Management
When context ends, state is cleaned up
Session
Request
Conversation
Built-in Scopes
Request Request Request Request Request Request Request Request
Conversation Conversation
Session Session
Application
Built-in Scopes
@ApplicationScoped
@SessionScoped
@RequestScoped
@ConversationScoped
@Dependent
No annotation
Default
Application Scope
@Named
@ApplicationScoped
public class Cache implements Serializable {
@Inject
private Conversation conversation;
@RequestScoped
public class BookService {
@Inject
private IsbnGenerator generator;
// ...
}
Summary
Binding
@Named
State management
Scopes