二章:More about Beans
一个BEAN通常是包含业务逻辑的应用程序类,它可通过JAVA代码来调用,也能通过EL来访问。BEAN可以访问事务性资源,其生命周期由容器来管理,大多数的BEAN通常是stateful和contextual的。
(以下两段不是直译,是由我的理解总结而来)
什么是stateful(可持续状态的),stateful和客户端能引用到什么样的BEAN实例对象有关,stateless(或singleton单例?这个有疑问)情况下,不同客户端引用的是不同的BEAN实例,而stateful情况下,不同客户端能共享BEAN实例。
什么是contextual,如上所述stateless(或singleton单例)不能够管理BEAN实例生命周期,而stateful能够管理生命周期,不过这种管理是由容器直接管理,而要想由程序控制的,更加细化的生命周期管理则要引入contextual(上下文的)概念,contextual管理由BEAN Scope来实现。RequestScoped指BEAN实例上下文生命周期只属于一个线程或客户端, SessionScoped指BEAN实例上下文生命周期可被多个线程或客户端共享, ApplicationScoped指BEAN实例上下文生命周期可被所有线程或客户端共享。
2.1Bean的构造
一个BEAN包括:
一组Bean Types集合
一组Qualifiers限定器
一个Scope
(可选的)一个Bean EL name
一组interceptor bindings拦截绑定
一个BEAN实现
可能还有一个Alternative选择器
2.1.1 Bean types,qualifiers and dependency injection(详情见第四章)
A bean type是用户可见的类名或接口名。
如下例有四个TYPE,可见的三个,另加上Object
而下面的只有三个,两个接口名,另加上Object,其类名用户不可见
Bean Types 可由@Typed来限定,如下例
若一个接口有多个实现,可由@Qualifiers来限定
限定器定义如下
限定器实现如下
限定器使用如下
2.1.2 Scope(详情第五章)
2.1.3 EL name
在JAVA代码调用不可用的情况下,如JSP和JSF中,可用EL方式来调用BEAN。
BEAN 名称可由@Named来定义
2.1.4Alternatives选择器
限定器用于编译时选择,而选择器用于部署时选择,如测试环境下。。。
2.1.5Interceptor binding types 拦截绑定类型
使用@interceptor
定义拦截器
实现拦截器
使用拦截器
2.2什么类型的类是BEAN
以上我们提到过两种类型的BEANS:JavaBeans and EJB session beans.
2.2.1Managed Beans
CDI之前是通过@ManagedBeant来定义托管BEAN的。而在CDI中,不需要再用这种方式了,CDI容器认为符合以下条件的都是托管BEAN:
The unrestricted set of bean types for a managed bean contains the bean class, every superclass and all interfaces it implements directly or indirectly.
If a managed bean has a public field, it must have the default scope @Dependent.
Managed beans support the @PostConstruct and @PreDestroy lifecycle callbacks.
Session beans are also, technically, managed beans. However, since they have their own special lifecycle and take advantage of additional enterprise services, the CDI specification considers them to be a different kind of bean.
(CDI中托管BEAN还有什么特别之处么?我现在仍然不太理解,暂时的理解就是非WEB BEAN,因此不敢翻译,只把原文贴出来了,如果有清楚其中关系的,请给我留言,谢谢)
2.2.2 Session Beans
Session Beans属于EJB规范,相对于托管BEAN,它有特殊的生命周期,状态管理和并发模型,虽然这些特性托管BEAN也有,但是不同。但在CDI框架内,托管BEAN和SESSION可以互注,SESSION也可以互注,
2.2.3 Producer methods
@Producer
定义
使用
2.2.4 Producer fields