15.7. 资源注入

时至今日,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}")
    1@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 章 消息总线)等高级用法,此问题会在后续版本中予以改善。