springboot 攔截器intecpter中不能注入bean的解決方案
阿新 • • 發佈:2019-01-02
顯而易見,攔截器的執行是在bean的初始化之前,所以如果在程式碼中直接寫上如下圖所示
因為UserService初始化在攔截器之後.
所以要在攔截器中直接注入 現在探索出兩種方式
第一種 在攔截器配置檔案中注入UserService 把userService作為引數傳遞進攔截器的註冊方法裡 如下:
@Configuration public class WebAppConfig extends WebMvcConfigurationSupport { @Autowired private UserService userService; @Bean public AuthenticationInterceptor authenticationInterceptor(UserService userService) { return new AuthenticationInterceptor(userService); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new AuthenticationInterceptor(userService)) .addPathPatterns("/**") .excludePathPatterns("/login"); super.addInterceptors(registry); }
注入成功.
只不過webAppConfig中在編譯的時候 系統會提示userService為空.
第二種:
SpringContextinterceptorAdapter()實現了ApplicationContextAware的介面
ApplicationContextAware的工具類,可以通過其它類引用它以操作spring容器及其中的Bean例項。
具體程式碼:
package fzm.tcm.security.annotation; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; @Component public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String name) { return getApplicationContext().getBean(name); } public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); } }
第三種來源於百度 度娘首條說 在配置檔案中把
@Autowire public AuthenticationInterceptor authenticationInterceptor() { return new AuthenticationInterceptor(); }
@Autowire註解換成@Bean註解有奇效 沒看出來.... 反正我沒實現出來 可能我的程式碼這種方法實現不了吧
(45°角仰望天空....)
以上 隨便轉載 不要暴露我禿頭的蹦迪身份就好