时至今日,Inversion of Control,Dependency Injection等概念已经耳熟能详;Spring等IoC容器也大行其道;甚至于很多同学并没有真正理解到底什么是IoC以及它带给我们的意义,但一个个的Spring用得倍熟。究其原因,是因为Spring为我们提供了许多便利,尤其是对象的创建与销毁。OperaMasks同样如此,你所需要的任何资源,只需要通过一个@Inject即可注入。在OperaMasks中,你可以注入以下资源:
java.util.logging.Logger javax.faces.context.FacesContext javax.faces.context.ExternalContext javax.faces.application.Application javax.faces.application.NavigationHandler javax.el.ExpressionFactory org.operamasks.faces.event.EventBroadcaster org.apache.commons.logging.Log
举个简单的例子,如果你要使用 java.util.logging.Logger对象,那么,你只需要:
@Inject private Logger logger
OperaMasks会根据对象类型自然判断出你需要注入的资源是什么。上例中,由于Logger是java.util.longg.Logger,因此,OperaMasks会自动初始化 logger对象,然后你就可以拿着 logger对象直接用了。
此外,你还可以在@Inject中指定EL表达式,OperaMasks会对该EL表达式求值,并将结果赋值给该属性,如:
@ManagedBean(name="testBean",scope=ManagedBeanScope.SESSION)
public class TestBean {
@Inject("#{LiteBean.name}")
private String name;
}如果你希望这个name属性能够被其它EL表达式所访问,那么,你就再加一个@Accessible的声明:
@ManagedBean
public class TestBean {
@Inject("#{LiteBean.name}")
@Accessible
private String name;
}这样,别人就可以通过#{TestBean.name}访问该属性了。
同时,OperaMasks也支持JavaEE 5.0中规定的跟资源注入相关的注解,如:
@Resource @Resources @EJB @EJBs @WebServiceRef @WebServiceRefs @PersistenceContext @PersistenceContexts @PersistenceUnit @PersistenceUnits
假设我要注入一个数据源,那么,你可以这样:
@Resource(name="jdbc/MyDataSource") DataSource ds;
需要提醒的是:在OperaMasks中,如果需要在LiteBean中进行资源注入,必须要确保是基于IoVC创建的。换言之,直接在页面中通过EL表达式引入的LiteBean无法正确的进行资源注入、MessageBus的引入(请参考第 23 章 消息总线)等高级用法,此问题会在后续版本中予以改善。