美文网首页
在非Spring Ioc管理的类中,使用@Autowired自动

在非Spring Ioc管理的类中,使用@Autowired自动

作者: DOB_8199 | 来源:发表于2022-03-05 17:30 被阅读0次

在使用阿里的excel转换工具时,由于AnalysisEventListener 不能交由spring管理,但我们需要在其中注入service来操作数据库。

由于在非Spring Ioc管理的类中,使用@Autowired自动注入Ioc中的Bean对象时,会出现异常,所以需要通过其他途径引入service。

解决方案一


1. 在SubjectExcelListener类中添加有参构造器,传入service实例,这样在new SubjectExcelListener的时候就可以手动的传入service。

解决方案二


获取当前Ioc容器,直接从Ioc容器中获取Bean。

获取到当前的WebApplicationContext:WebApplicationContext context = ContextLoader.getCurrentWebApplicationContext();

通过Bean全类名或Bean的id获取Bean实例即可:private Service service = context.getBean(Service.class);

暂存疑问


1. 为什么AnalysisEventListener不能交给spring进行管理呢?

推测:由于ServletContextListener的生命周期是由servlet容器(例如tomcat)管理的,而spring容器中的bean的生命周期是由spring容器管理的。项目启动时上例中的实现它的Listener是由servlet容器实例化并调用其contextInitialized方法,而servlet容器并不认得@Autowired注解,因此导致Service实例注入失败。因此推测AnalysisEventListener也是由servlet容器管理,因此不能直接交于spring进行管理

相关文章

网友评论

      本文标题:在非Spring Ioc管理的类中,使用@Autowired自动

      本文链接:https://www.haomeiwen.com/subject/xnemrrtx.html