关于spring中在拦截器或者过滤器中 直接注入由ioc管理的普通bean 为null的情况
过滤器可以在init方法中从上下文获取
public class TestFilter implements Filter {
private TestService testService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ServletContext servletContext = filterConfig.getServletContext();
WebApplicationContext cxt = WebApplicationContextUtils.getWebApplicationContext(servletContext);
if (testService == null) {
testService = (TestService) cxt.getBean("testService");
}
}
}
如果想获取jar里面带的bean 比如在过滤器里面想使用redis的话 采用上述方式是不行的 ,我们采用构造器注入的方式
先注入redis
@Configuration
public class TestConfig {
@Bean
public JedisConnectionFactory getJedisConnectionFactory(){
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setHostName("127.0.0.1");
connectionFactory.setPort(6379);
return connectionFactory;
}
@Bean
public StringRedisTemplate getRedisTemplate(){
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(getJedisConnectionFactory());
return redisTemplate;
}
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
//通过构造器传入StringRedisTemplate
registrationBean.setFilter(new TestFilter(getRedisTemplate()));
registrationBean.setUrlPatterns(new ArrayList<>(Arrays.asList("/*")));
return registrationBean
}
}
public class TestFilter implements Filter {
private TestService testService;
private StringRedisTemplate redisTemplate;
//通过构造器实例化redisTemplate 就可以直接使用了
public TestFilter(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
ServletContext servletContext = filterConfig.getServletContext();
WebApplicationContext cxt = WebApplicationContextUtils.getWebApplicationContext(servletContext);
if (testService == null) {
testService = (TestService) cxt.getBean("testService");
}
}
}
2.拦截器也是同样的道理 可以通过构造器注入
@Configuration
public class TestConfig extends WebMvcConfigurationSupport {
@Bean
public JedisConnectionFactory getJedisConnectionFactory() {
JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
connectionFactory.setHostName("127.0.0.1");
connectionFactory.setPort(6379);
return connectionFactory;
}
@Bean
public StringRedisTemplate getRedisTemplate() {
StringRedisTemplate redisTemplate = new StringRedisTemplate();
redisTemplate.setConnectionFactory(getJedisConnectionFactory());
return redisTemplate;
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
//通过构造器注入
registry.addInterceptor(new TestInterceptor(getRedisTemplate())).addPathPatterns("/**").excludePathPatterns("/emp/toLogin", "/emp/login", "/js/**", "/css/**", "/images/**");
super.addInterceptors(registry);
}
}
public class TestInterceptor implements HandlerInterceptor {
private StringRedisTemplate stringRedisTemplate;
//通过构造注入
public TestInterceptor(StringRedisTemplate stringRedisTemplate){
this.stringRedisTemplate=stringRedisTemplate;
}
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}