我在理解如何使用注释方面遇到了一些问题,特别是对于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" />
由于
答案 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 {
非常感谢