在上一篇讲到如何在Tomcat中正常启动Socket服务,现在服务可以正常启动了,但接下来调用Mybatis写库时发现遇到问题。
问题:
在使用自动注入bean的DAO时,提示空指针错误,说明对象没有实例化
@Autowired(required = false)
private BoxDectdata4DAO boxDectdata4DAO;
原因:
我们启动的Socket服务是创建了一个监听器类SocketListener,并且继承ServletContextListener,而Spring其实也是一个监听器ContextLoaderListener(如下所示),我们的SocketListener类如果要使用Spring监听器里面的注入bean,就需要获取到它的上下文对象。
<!-- Spring 监听 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Socket 监听 --> <listener> <listener-class>com.ux.receive.impl.SocketListener</listener-class> </listener>
解决方案:
在我们的监听器SocketListener的初始化方法中使用内置方法WebApplicationContextUtils.getWebApplicationContext可以获取到项目的上下文,然后就能通过该上下文对象加载Bean获得注入的对象。
//@Component //监听器是web层的组件,它是tomcat实例化的,不是Spring实例化的。不能放到Spring中
public class SocketListener implements ServletContextListener {
protected final static Logger logger = LoggerFactory.getLogger(SocketListener.class);
private SocketThread socketThread;
private BoxDectdata4DAO boxDectdata4DAO;
@Override
public void contextInitialized(ServletContextEvent sce) {
WebApplicationContext context= WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
boxDectdata4DAO=(BoxDectdata4DAO)context.getBean("boxDectdata4DAO");
//可以使用boxDectdata4DAO 执行业务了...
}
}