CDI对JSF和EJB模型使用都产生比较大的变化,比如对JSF影响,下面是JSF的一个用来显示的Bean:
import javax.inject.Named;
@Named public class MessageServerBean {
public String getMessage() { return "Hello World!"; } }
|
使用了@Named来标注,那么在jsp页面中就可以写入标签:
Message is : #{messageServerBean.message}<br> Message Server Bean is : #{messageServerBean}
|
达到输出如下结果
Message is : Hello World! Message Server Bean is : eedemo.MessageServerBean@xxxxxxx
|
也就是说,@Named标注实际相当于给MessageServerBean取名eedemo.MessageServerBean(当然你也可以显式写一个名称),你就可以直接以messageServerBean对其getter方法进行输出了。
CDI另外一个特点就是将对象在容器中场景生命周期标注出来,如下:
@Named("itemProcessor") @RequestScoped //表示生命周期是request,每次request请求结束,生命就终止,也可以有Session或 Application等 public class ItemProcessor {
@Inject private ItemDao itemDao; //表示ItemDao需要被注入
... }
|
public class PersonFactory {
@Produces @RequestScoped public Person createPerson() { return new Person(); } }
|
但Person被注入到其他需要Person的地方之前,createPerson首先被执行,在这个方法中你能做一些注入之前的准备工作。
CDI还提供Events事件注入,使得异步事件模式能够引入消息监听者也就是消费者,只要标注@Observes ,即可处理发出的事件:
public void observeUserEvent(@Observes User user) { ... }
|
事件模式的引入可以为我们实现业务场景融合提供手段,见ZK的CDI应用:
@Named @SessionScoped public class HelloWorld extends GenericComposer implements Serializable {
@Inject @ComponentId("guestName") Textbox guestName; @Inject @ComponentId("sayHelloBtn") Button sayHelloBtn; @Inject @ComponentId("helloWindow") Window helloWindow;
public void sayHello(@Observes @Events("sayHelloBtn.onClick") MouseEvent evt) { helloWindow.setTitle("Hello " + guestName.getValue()); } }
|
转自:http://www.jdon.com/38322