這次在項目中編寫Token代碼邏輯的時候,遇到了一個空指針問題,經過排查發現,Filter里面無法利用@Autowired。
所以此次文章用來解決這一問題。
經過查閱資料發現,spring容器初始化Bean的順序是Listener->Filter->servlet.
那么我可以在Listener里面預先加載我們想要的Bean對象,然后經過Filter構造函數將對象傳進去。
下面是具體的代碼:
這個是啟動監聽器。
@Slf4j
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class StartLinster implements ApplicationListener<ApplicationEvent> {
@Autowired
TokenService tokenService;
@Override
public void onApplicationEvent(ApplicationEvent applicationEvent) {
log.info("提前注入token");
}
}
里面TokenService是Service層,也是我們想要注入的對象。
這個是Filter啟動的相應代碼,可以看到,Listener啟動順序是最高的。
@Bean
public FilterRegistrationBean<AuthenticationFilter> initAuthenticationFilter(TokenService tokenService){
FilterRegistrationBean<AuthenticationFilter> authenticationFilterFilter = new FilterRegistrationBean<>();
AuthenticationFilter authenticationFilter = new AuthenticationFilter(tokenService);
authenticationFilter.addExcludePatterns("/api/user/login");
authenticationFilterFilter.setFilter(authenticationFilter);
authenticationFilterFilter.setOrder(Ordered.LOWEST_PRECEDENCE);
authenticationFilterFilter.addUrlPatterns("/api/*");
return authenticationFilterFilter;
}