在简单性和正确性而言,什么是注射了不同作用域的同一类对象的最佳方式?
在一个servlet我想注入了相同的类的对象用不同的作用域。 不过不知道是否要使用JSF。
- 简单性:制作一个
Qualifier
和每个范围生产者方法是太多; 形成交界面,两个阶级,添加和替代在beans.xml
也太多; 具有Address#isCurrent()
方法没有意义。 - 正确性:JSR299,3.11说: 不建议作为注入点限定符使用@Named的。 不过不知道为什么。
虽然使用@Named
于注射点可与@ApplicationScoped
和@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;