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

Define bean using factory method in plain Java EE - WITHOUT Spring

我想创建一个可以通过普通 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;

老天爷 Spring 我会按照指南 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 的 plain Java EE 中以某种方式实现相同的目的?我可以用类似的方式定义一个 bean - 如果可以,在哪里(在哪个配置文件中)?

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

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

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

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

对于这些类型的生产者,CDI 提供了一种易于使用的工厂模式实现。您几乎可以在任何地方注入任何东西,不仅 类 还可以注入接口、其他 JEE 资源甚至原始类型。注入点不必是 class 成员,但也可以是例如方法中的参数 ...

每次注入都会给您一个不同的 Proxy,因此如果需要,您甚至可以向 Bean 注入多个 Client。这些 Proxy 对象是否引用相同的实例取决于您对工厂方法的实现,但通常您不希望这样。