消息监听器无法注入bean

Posted xyhero

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息监听器无法注入bean相关的知识,希望对你有一定的参考价值。

问题描述:

在activemq的监听器中,通过注解@Autowired或@Resource注入bean时,获取到的bean为null。调用该bean的方法时会报空指针异常。

问题原因:

当调用bean内方法时,spring容器中还没有完成对注解bean的扫描,dispatcher.xml中配置的注解bean的优先级没有框架中的contextListener的优先级高,所以contextListener初始化的时候根据@Autowired扫描,肯定是null的。

解决办法:

在web.xml文件中增加一个监听器类,该类实现ServletContextListener,ApplicationContextAware这两个接口。

1
2
3
<listener>
    <listener-class>com.activemq.common.InitComponent</listener-class>
</listener>

当容器启动的时候,会执行该类中的contextInitialized(ServletContextEvent servletContextEvent)方法。

我们要做的,就是在该类中新增获取bean的方法。

1
2
3
4
5
6
7
8
9
10
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {  
    checkApplicationContext();  
    return (T) applicationContext.getBean(name);  
}
private static void checkApplicationContext() {  
    if (applicationContext == null) {
        throw new IllegalStateException("applicaitonContext未注入");  
    }  
}

此时,获取bean的方式就变为:

1
2
ConsumerDao consumerDao = InitComponent.getBean("ConsumerDao");
consumerDao.saveMessage(param);

注意:

ConsumerDao接口上需要加上注解:@Repository("ConsumerDao")

参考文章:

http://blog.csdn.net/gaoshili001/article/details/77776863

以上是关于消息监听器无法注入bean的主要内容,如果未能解决你的问题,请参考以下文章

activiti中实现TaskListener注入Spring的bean

由一个RABBITMQ监听器死循环引出的SPRING中BEAN和MAPPER接口的注入问题

ActiveMQ消息生产者自动注入报错:Could not autowire. No beans of 'JmsMessagingTemplate' type found(示例代码(代

消息模板-RabbitTemplate

service 无法注入bean问题

使用注解,spring中无法注入bean?