在spring的過濾器中注入實體類(@autowire會失效可使用這個方法)


轉載:難得可貴的好文章

https://blog.csdn.net/chl191623691/article/details/78657638

 

首先,本文   絕對是好文!不止本文,作者的文章都是很經典的,希望大家給小編一個贊,關注一下!


今天在做用戶使用cookie自動登錄的時候,發現在LoginFilter中讀取到cookie以后要進行查詢數據庫然后進行用戶名和密碼的比對,查詢數據庫肯定要用到Service和Dao,一開始我以為在service屬性上直接使用注解就能搞定,沒想到啊,還是報了空指針異常。類似下面這樣(這樣是注入不進來的)
@Autowired
private UserService userService;
先給大家說說為什么在Filter中注入不進來service
我建立一個全局攔截器,當然,我把它命名為LoginFilter,它繼承了Filter,web應用啟動的順序是:listener->filter->servlet,而因為項目應用了spring mvc,所以我們會有一個配置文件(applixationContext.xml),我們在配置spring時會用到spring的listener,它會讀取application.xml里的配置對spring context進行初始化;項目啟動時,先初始化listener,因此配置在applicationContext.xml里的bean會被初始化和注入;然后再來就filter的初始化,再接着才到我們的dispathServlet的初始化,因此,當我們需要在filter里注入一個注解的bean時,就會注入失敗,因為filter初始化時,注解的bean還沒初始化,沒法注入。

遇到一個問題,我們要知其然,並且知其所以然,知道原因以后下面就是解決了!
今天就來教大家怎么在Java的Filter中注入Service
1、在我們的LoginFilter中加入需要注入的屬性
/**
* userService屬性
*/
private UserService userService;
2、在LoginFilter的init()方法中獲取 ServletContext
①這里有三種方式獲取ServletContext

1)在javax.servlet.Filter中直接獲取 

ServletContext context = config.getServletContext(); 

2)在HttpServlet中直接獲取 

this.getServletContext() 

3)在其他方法中,通過HttpServletRequest獲得 

request.getSession().getServletContext();

3、然后在LoginFilter中獲取我們的WebApplicationContext上下文
WebApplicationContext cxt =WebApplicationContextUtils.getWebApplicationContext(sc);
從下面spring源碼的可以看到WebApplicationContextUtils.getWebApplicationContext(sc)需要傳入一個ServletContext對象(就是我們上面獲取的)我們把sc放進去

public static WebApplicationContext getWebApplicationContext(ServletContext sc) {
return getWebApplicationContext(sc, WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
}
4、從WebApplicationContext上下文中獲取bean,賦值給我們的userService
userService = (UserService) cxt.getBean(UserService.class);
這樣就完成注入了 ,是不是很方便呢!

下面小編把部分源碼放上面,方便大家參考:

public class LoginFilter implements Filter {
protected static final Logger logger = Logger.getLogger(LoginFilter .class);

private FilterConfig config;

/**

​* userService屬性(作者的企鵝群:162582394密碼1歡迎進群交流學習)

*/

private UserService userService;

@Override

public void init(FilterConfig filterConfig) throws ServletException {

config = filterConfig;

/**

* 注入service  用戶查詢數據庫

*/

ServletContext sc = filterConfig.getServletContext();

WebApplicationContext cxt =WebApplicationContextUtils.getWebApplicationContext(sc);

if(cxt != null && cxt.getBean(UserService.class) != null && userService == null){

userService = (UserService) cxt.getBean(UserService.class);

}

} } }

然后我們就可以調用userService中的方法了:

JSONObject data =userService.userLogin(userName,passWord);
---------------------
作者:專注JavaWeb開發
來源:CSDN
原文:https://blog.csdn.net/chl191623691/article/details/78657638
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM