在普通 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 对象是否引用相同的实例取决于您对工厂方法的实现,但通常您不希望这样。
我想创建一个可以通过普通 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 对象是否引用相同的实例取决于您对工厂方法的实现,但通常您不希望这样。