参考:web
加载顺序 http://blog.csdn.net/wayfoon322/article/details/2418011 spring
filter 使用注入bean http://zy116494718.iteye.com/blog/1918131spa
1. 项目spring使用的是注解方式:在filter里debug看源码,类型里.net
allBeanNamesByType ConcurrentHashMap<K,V> (id=169) ,是有想要的roleService的,可是在以下代码里就是取不到。总报异常:debug
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'roleManageService' is definedcode
WebApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(request.getServletContext());xml
RoleManageService roleManageService = (RoleManageService) ac.getBean("roleManageService"); blog
2. 试了使用网上的各类接口:接口
实现ApplicationContextAware接口get
extends ContextLoaderListener implements ServletContextListener
等等,仍是获取不到bean实例
3. 最后试着将这个RoleManageService改为了xml配置方式, 终于在filter里获取到了,仍是用1。的方法获取,观察下面这两张debug的截图
<bean id="roleManageService" class="com.ljq.service.RoleManageService" > <property name="roleManageDao"> <ref bean="roleManageDao"/> </property> </bean>
图1
图2
图1是使用注解的方式,allBeanNamesByType里有role的实例,构造器没有role实例,getBean的时候获取异常。
图2是使用XML配置的方式,allBeanNamesByType里有role的实例,构造器有role实例,getBean的时候正常。
4.基于上述缘由,我想应该是在web加载顺序的时候,
spring容器的注解方式在filter以后,致使获取不到报异常。
spring容器的xml配置方式在filter以前,因此能获取到。
so.将这些要使用在filter的实例改为了xml配置方式,其它的仍是用注解
但我参考别人的文章,人家为何能在filter里获取到注解的实例呢?哎,才蔬学浅好郁闷。。