0

我在理解如何使用注释时遇到了一些问题,尤其是对于 bean。

我有一个组件

@Component
public class CommonJMSProducer

我想在另一个类中使用它,我想我可以这样做以获得一个独特的对象

public class ArjelMessageSenderThread extends Thread {
    @Inject
    CommonJMSProducer commonJMSProducer;

但 commonJMSProducer 为空。

在我的 appContext.xml 我有这个:

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

谢谢

4

3 回答 3

1

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

<context:annotation-config/>

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

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

或者

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

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

或者

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

于 2013-10-24T16:35:30.350 回答
0

这取决于您如何创建ArjelMessageSenderThread.

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

但是,由于您 extend Thread,我认为这不应该是标准的 Spring bean。如果您使用创建ArjelMessageSenderThread自己的实例,new则应将@Configurable注释添加到ArjelMessageSenderThread. @Configurable即使实例不是由 Spring 创建的,也会注入With依赖项。有关更多详细信息,请参阅@Configurable 的文档,并确保您启用了加载时间编织

于 2013-10-24T16:43:25.713 回答
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 {

不管怎么说,还是要谢谢你

于 2013-10-25T09:16:09.687 回答