问题:我建立一个全局拦截器,当然,这是的时候建立的,我把它命名为LogFilter,它继承了Filter,web应用启动的顺序是:listener->filter->servlet,而因为项目应用了boot,所以我们项目启动时,先初始化listener,因此注解的bean会被初始化和注入;然后再来就filter的初始化,再接着才到我们的dispathServlet的初始化,因此,当我们需要在filter里注入一个注解的bean时,就会注入失败,因为filter初始化时,注解的bean还没初始化,没法注入。
那么,解决方法如下:
public FilterRegistrationBean filterProxy(){ FilterRegistrationBean registrationBean = new FilterRegistrationBean(); DelegatingFilterProxy httpBasicFilter = new DelegatingFilterProxy(); registrationBean.setFilter(httpBasicFilter); Mapm = new HashMap (); m.put("targetBeanName","logFilter"); m.put("targetFilterLifecycle","true"); registrationBean.setInitParameters(m); List urlPatterns = new ArrayList (); urlPatterns.add("/*"); registrationBean.setUrlPatterns(urlPatterns); return registrationBean;}
这样你就可以在LogFilter里面添加@Autowired下的bean了。
public class LogFilter implements Filter { @Autowired @Qualifier(value="rztRabbitTemplate") private RabbitTemplate rabbitTemplate;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
@Bean public FilterRegistrationBean securityFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new DelegatingFilterProxy("SecurityFilter")); registration.addInitParameter("targetFilterLifecycle", "true"); registration.addUrlPatterns("/*"); registration.setOrder(102); return registration; } @Bean(name = "SecurityFilter") public SecurityFilter getSecurityFilter(){ return new SecurityFilter(); }