在普通Java EE中使用工厂方法定义bean - WITHOUT Spring

时间:2015-05-20 09:19:09

标签: java java-ee dependency-injection autowired inject

我想创建一个可以通过普通Java EE自动注入(自动装配)的bean,不是Spring

我的代码是:

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;

@ApplicationScoped
public class MyConnector {
    ....
    private Client client = ClientBuilder.newClient();
    ....
}

我想使用依赖注入:

    @Inject
    private Client client;

在古老的春天,我只会按照指南http://docs.spring.io/spring/docs/3.1.0.M1/spring-framework-reference/html/beans.html#beans-factory-class-static-factory-method

定义bean
<bean id="client"
    class="javax.ws.rs.client.ClientBuilder"
    factory-method="createInstance"/>

并且@Autowired将注入正确的bean。

问题:我可以在没有Spring的普通Java EE 中以某种方式实现相同的目标吗?我可以用类似的方式定义bean - 如果是这样,在哪里(在哪个配置文件中)?

1 个答案:

答案 0 :(得分:1)

您可以为此目的编写自己的CDI制作人

@Dependent public ClientFactory{
   @Produces Client createClient() {
       return ClientBuilder.newClient(); 
   }
}

现在您可以使用CDI的@Inject来获取Bean中的实例

@ApplicationScoped public class MyConnector {    
    @Inject private Client client;
}

通过这些生产者,CDI提供了一种易于使用的工厂模式实现。您几乎能够注入所有内容,不仅包括类,还包括接口,其他JEE资源甚至原始类型。注射点不必是类成员,但也可以是例如方法中的一个参数......

每次注入都会为您提供不同的代理,因此如果必须,您可以向Bean注入多个客户端。如果那些Proxy对象引用相同的实例取决于您的工厂方法的实现,但通常您不希望这样。