就简单性和正确性而言,注入具有不同作用域的同一类的对象的最佳方法是什么?
在一个 servlet 中,我想注入具有不同范围的同一类的对象。还不知道要不要用jsf。
- 简单:
Qualifier
为每个作用域制作一个和一个生产者方法太多了;做一个接口,两个类,在里面添加替换beans.xml
也太多了;有Address#isCurrent()
方法没有意义。 - 正确性:JSR299, 3.11 说:不推荐使用 @Named 作为注入点限定符。 还是不知道为什么。
虽然@Named
在注入点使用适用于@ApplicationScoped
and@RequestScoped
但不适用于@SessionScoped
. 请参阅下面的命名片段。
在春天很容易:
春天片段
<bean id="currentAddress" class="xxx.Address" scope="session" />
<bean id="newAddress" class="xxx.Address" scope="request" />
<bean id="servlet" class="xxx.MyServlet">
<property name="currentAddress" ref="currentAddress" />
<property name="newAddress" ref="newAddress" />
</bean>
命名片段
/* Address class */
@Produces @RequestScoped @Named(value="request")
public Address getNewAddress(){
return new Address();
}
@Produces @SessionScoped @Named(value="application")
public Address getCurrentAddress(){
return new Address();
}
/* Servlet */
@Inject @RequestScoped @Named("request") private Address newAddress;
@Inject @ApplicationScoped @Named("application") private Address currentAddress;