在简单性和正确性方面,用不同的作用域注入同一个类的对象的最佳方法是什么?
在servlet中,我希望注入具有不同作用域的同一个类的对象。还是不知道是否要用jsf。
Qualifier和一个生产者方法太多了;在beans.xml中创建一个接口、两个类以及添加和替代方法也太多了;拥有一个Address#isCurrent()方法是没有意义的。@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;发布于 2012-05-04 18:14:49
感谢@nsfyn55指出,好文章在阅读了“正确的方法”一节后,想出了在简单性和正确性方面实现它的最佳方法。
因此,我只使用一个接口作为限定符注释。
/* Qualifier annotation */
@Qualifier
@Retention(RUNTIME)
@Target({FIELD,METHOD})
public @interface Scope {
Type value();
enum Type { REQUEST, SESSION, APPLICATION };
}
/* Address class */
@Produces @Scope(REQUEST) @RequestScoped
public Address request() {
return new Address();
}
@Produces @Scope(SESSION) @SessionScoped
public Address session() {
return new Address();
}
/* Servlet */
@Inject @Scope(REQUEST)
private Address newAddress;
@Inject @Scope(SESSION)
private Address currentAddress;发布于 2012-04-29 17:37:24
包含此建议的原因与选择枚举而不是对常量进行任意字符串的原因相同,这是因为它不具有类型安全性。您很容易输入这个类的名称,它会很好地编译,并在运行时失败。之所以包含这个建议,是因为在大多数情况下,当您有能力在编译时强制执行这些约束时,@named会使您的应用程序变得不必要的脆弱。
下面是一个概述原因的好文章:
处理这种情况的首选方法是使用带有枚举值的@限定符。签出题为“字符串限定符是遗产”和“正确的方式”的步骤来处理这个部分。
https://stackoverflow.com/questions/10373617
复制相似问题