【问题标题】:Autowiring two different beans of same class自动装配同一类的两个不同的bean
【发布时间】:2011-05-26 15:16:24
【问题描述】:

我有一个封装连接池的类,该类从如下图所示的 spring 配置中获取其连接详细信息:

<bean id="jedisConnector" class="com.legolas.jedis.JedisConnector" init-method="init" destroy-method="destroy">
    <property name="host" value="${jedis.host}" />
    <property name="port" value="${jedis.port}" />
</bean>

此 bean 稍后在服务中使用,并使用 @Autowire 注释自动装配。

我的问题是,我怎样才能复制这个 bean 并给它不同的连接细节,然后在服务中 @Autowire 它。 意思除了上面我还有:

<bean id="jedisConnectorPOD" class="com.legolas.jedis.JedisConnector" init-method="init" destroy-method="destroy">
    <property name="host" value="${jedis.pod.host}" />
    <property name="port" value="${jedis.pod.port}" />
</bean>

在服务中:

@Autowired //bean of id jedisConnector
JedisConnector beanA;

@Autowired //bean of id jedisConnectorPOD
JedisConnector beanB;

【问题讨论】:

    标签: java spring annotations


    【解决方案1】:

    您可以将@Autowired@Qualifier 结合使用,但在这种情况下,我建议使用@Autowired 而不是@Resource

    @Resource(name="jedisConnector")
    JedisConnector beanA;
    
    @Resource(name="jedisConnectorPOD")
    JedisConnector beanB;
    

    甚至更简单:

    @Resource
    JedisConnector jedisConnector;
    
    @Resource
    JedisConnector jedisConnectorPOD;
    

    【讨论】:

    • 另外,如果还使用 JEE 应用服务器(例如 JBoss),它也会尝试处理 @Resource 并且一切都会中断。
    • @OrangeDog:我将它与 JBoss 一起使用,没有任何问题。
    • @skaffman - 第一个还是第二个?即使 Spring 已经完成,JBoss 5 肯定会尝试满足资源。它可能做对了,但你可能仍然不想让它尝试。
    • 我在tomcat和spring中使用了第二个选项,效果很好。
    • 你能证明..为什么第二种方法适合这种情况?
    【解决方案2】:
    @Autowired
    @Qualifier("jedisConnector")
    JedisConnector beanA;
    
    @Autowired
    @Qualifier("jedisConnectorPOD")
    JedisConnector beanB;
    

    【讨论】:

    猜你喜欢
    • 2017-04-26
    • 1970-01-01
    • 2014-12-14
    • 2013-01-08
    • 2012-05-19
    • 2016-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多