我正在使用Spring MVC应用程序并遇到问题。我是Spring的新手,所以如果我的工作有点笨拙,请原谅我。基本上我有一个java类ContractList。在我的应用程序中,我需要这个类的两个不同的对象(它们都必须是单例)
public class MyClass {
@Autowired
private ContractList contractList;
@Autowired
private ContractList correctContractList;
.. do something..
}
请注意,这两个bean都没有在ApplicationContext.xml中定义。我只使用注释。因此,当我尝试访问它们时 - contractList和correctContractList最终引用同一个对象。有没有办法以某种方式区分它们而不在ApplicationContext.xml中显式定义它们?
答案 0 :(得分:6)
您可以为bean提供限定符:
@Service("contractList")
public class DefaultContractList implements ContractList { ... }
@Service("correctContractList")
public class CorrectContractList implements ContractList { ... }
并像这样使用它们:
public class MyClass {
@Autowired
@Qualifier("contractList")
private ContractList contractList;
@Autowired
@Qualifier("correctContractList")
private ContractList correctContractList;
}
在仍使用@Autowired
的xml配置中,这将是:
<beans>
<bean id="contractList" class="org.example.DefaultContractList" />
<bean id="correctContractList" class="org.example.CorrectContractList" />
<!-- The dependencies are autowired here with the @Qualifier annotation -->
<bean id="myClass" class="org.example.MyClass" />
</beans>
答案 1 :(得分:0)
如果您无权访问带有@Autowired
注释的类,则可以做另一件事。如果星标对您有利,您也许可以利用@Primary
注释。
假设您有一个无法修改的库类:
class LibraryClass{
@Autowired
ServiceInterface dependency;
}
以及您执行控制的另一个类:
class MyClass{
@Autowired
ServiceInterface dependency;
}
像这样设置您的配置,它应该可以工作:
@Bean
@Primary
public ServiceInterface libraryService(){
return new LibraryService();
}
@Bean
public ServiceInterface myService(){
return new MyService();
}
并用MyClass
注释Qualifier
,以告诉它使用myService
。 LibraryClass
将使用带有@Primary
注释的Bean,而MyClass
将使用具有以下配置的另一个:
class MyClass{
@Autowired
@Qualifier("myService")
ServiceInterface dependency;
}
这是一种罕见的用法,但是在有我自己的类需要使用旧版实现和新实现的情况下使用它。