CDI 1.1-在ApplicationScope中注入依赖范围

时间:2018-09-29 07:07:09

标签: java cdi

说我有一个@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如何管理范围。

1 个答案:

答案 0 :(得分:1)

  

每次使用连接bean时,CDI都会调用生产者方法

不。因为默认范围是Dependent,所以生产者方法被调用一次。您的连接生命周期受限于MyCustomerService生命周期

  

将代理Connection类

如果Bean在@Dependent范围内,则客户端将直接引用其实例(clientproxy只是为NormalScope创建的)

但是,如果bean具有装饰器或拦截器,则会创建一个代理(未创建客户端代理,因为没有用于选择bean的上下文,而是创建了另一个代理来应用装饰器和拦截器),我在weblogic应用程序服务器上对此进行了测试< / p>