SpringMVC:在SSM框架的Tomcat中启动Socket服务,并利用监听器Listener获取注入的bean

在上一篇讲到如何在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 执行业务了...
	}

}

猜你喜欢

转载自blog.csdn.net/quan278905570/article/details/118345263