首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何注入具有不同作用域的同一个类的对象?

如何注入具有不同作用域的同一个类的对象?
EN

Stack Overflow用户
提问于 2012-04-29 16:03:26
回答 2查看 3.9K关注 0票数 1

在简单性和正确性方面,用不同的作用域注入同一个类的对象的最佳方法是什么?

在servlet中,我希望注入具有不同作用域的同一个类的对象。还是不知道是否要用jsf。

  • 简单性:为每个作用域创建一个Qualifier和一个生产者方法太多了;在beans.xml中创建一个接口、两个类以及添加和替代方法也太多了;拥有一个Address#isCurrent()方法是没有意义的。
  • 正确性: JSR299,3.11说:不建议使用@命名为注入点限定符。还是不知道为什么。 虽然在注入点使用@Named可以与@ApplicationScoped@RequestScoped一起工作,但不适用于@SessionScoped。见下面的命名片段。

在春天,这很容易:

春季片段

代码语言:javascript
复制
<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>

名为的代码片段

代码语言:javascript
复制
/* 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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-04 18:14:49

感谢@nsfyn55指出,好文章在阅读了“正确的方法”一节后,想出了在简单性和正确性方面实现它的最佳方法。

因此,我只使用一个接口作为限定符注释。

代码语言:javascript
复制
/* 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;
票数 2
EN

Stack Overflow用户

发布于 2012-04-29 17:37:24

包含此建议的原因与选择枚举而不是对常量进行任意字符串的原因相同,这是因为它不具有类型安全性。您很容易输入这个类的名称,它会很好地编译,并在运行时失败。之所以包含这个建议,是因为在大多数情况下,当您有能力在编译时强制执行这些约束时,@named会使您的应用程序变得不必要的脆弱。

下面是一个概述原因的好文章

处理这种情况的首选方法是使用带有枚举值的@限定符。签出题为“字符串限定符是遗产”和“正确的方式”的步骤来处理这个部分。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10373617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档