Spring注释组件

时间:2013-10-24 16:31:42

标签: java spring annotations components code-injection

我在理解如何使用注释方面遇到了一些问题,特别是对于bean。

我有一个组件

@Component
public class CommonJMSProducer

我想在另一个类中使用它,我认为我可以做到这一点有一个独特的对象

public class ArjelMessageSenderThread extends Thread {
    @Inject
    CommonJMSProducer commonJMSProducer;

但commonJMSProducer为null。

在我的appContext.xml中,我有这个:

<context:component-scan base-package="com.carnot.amm" />

由于

3 个答案:

答案 0 :(得分:1)

您必须配置Spring才能使用此自动装配功能:

<context:annotation-config/>

您可以找到基于注释的配置here的详细信息。

ArjelMessageSenderThread也必须由Spring管理,否则它不会篡改其成员,因为它不知道它。

如果你不能使它成为托管bean,那么你可以这样做:

ApplicationContext ctx = ...
ArjelMessageSenderThread someBeanNotCreatedBySpring = ...
ctx.getAutowireCapableBeanFactory().autowireBeanProperties(
    someBeanNotCreatedBySpring,
    AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT, true);

正如其他人指出的那样,您可以使用注释对不是由Spring创建@Configurable注释的对象使用依赖注入。

答案 1 :(得分:0)

这取决于您如何创建ArjelMessageSenderThread的实例。

如果ArjelMessageSenderThread是应该由spring创建的bean,则只需添加@Component(并确保通过组件扫描拾取包)。

但是,由于你扩展Thread,我不认为这应该是标准的Spring bean。如果您使用ArjelMessageSenderThread自己创建new个实例,则应将@Configurable注释添加到ArjelMessageSenderThread。即使实例不是由Spring创建的,也会注入@Configurable个依赖项。有关详细信息,请参阅documentation of @Configurable,并确保已启用load time weaving

答案 2 :(得分:0)

我使用XML而不是注释。对于不大的事情来说,这似乎很难。目前,我只是在xml

中有更多
<bean id="jmsFactoryCoffre" class="org.apache.activemq.pool.PooledConnectionFactory"
    destroy-method="stop">
    <constructor-arg name="brokerURL" type="java.lang.String"
        value="${brokerURL-coffre}" />
</bean>

<bean id="jmsTemplateCoffre" class="org.springframework.jms.core.JmsTemplate">
    <property name="connectionFactory">
        <ref local="jmsFactoryCoffre" />
    </property>
</bean>

<bean id="commonJMSProducer"
    class="com.carnot.CommonJMSProducer">
    <property name="jmsTemplate" ref="jmsTemplateCoffre" />
</bean>

另一个获取bean的类

@Component
public class ApplicationContextUtils implements ApplicationContextAware {

非常感谢