说我有一个@ApplicationScoped
服务班。
@ApplicationScoped
class MyCustomerService {
...
}
然后我想向该服务中注入一个Connection
对象。
@ApplicationScoped
class MyCustomerService {
private final Connection connection;
@Inject
MyCustomerService(final Connection connection) {
this.connection = connection;
}
...
}
Connection
对象是使用数据源通过@Produces
方法产生的。
class ConnectionProducer {
...
@Produces
Connection getConnection(final DataSource dataSource) {
return dataSource.getConnection();
}
...
}
Connection
类将被代理吗?每次我使用connection
bean时CDI都会调用生产者方法吗(不像RequestScoped,我的意思是每次调用都如此)?
我知道我可以@Inject
DataSource
,这只是在“学习” CDI如何管理范围。
答案 0 :(得分:1)
每次使用连接bean时,CDI都会调用生产者方法
不。因为默认范围是Dependent,所以生产者方法被调用一次。您的连接生命周期受限于MyCustomerService生命周期
将代理Connection类
如果Bean在@Dependent范围内,则客户端将直接引用其实例(clientproxy只是为NormalScope创建的)
但是,如果bean具有装饰器或拦截器,则会创建一个代理(未创建客户端代理,因为没有用于选择bean的上下文,而是创建了另一个代理来应用装饰器和拦截器),我在weblogic应用程序服务器上对此进行了测试< / p>