Spring @Autowire同一类的两个bean,它们没有在ApplicationContext中定义

时间:2013-03-20 06:29:30

标签: spring dependency-injection autowired

我正在使用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中显式定义它们?

2 个答案:

答案 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,以告诉它使用myServiceLibraryClass将使用带有@Primary注释的Bean,而MyClass将使用具有以下配置的另一个:

class MyClass{
   @Autowired
   @Qualifier("myService")
   ServiceInterface dependency; 
}

这是一种罕见的用法,但是在有我自己的类需要使用旧版实现和新实现的情况下使用它。