在非Spring Ioc管理的类中,使用@Autowired自动
在使用阿里的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进行管理