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

x號開發者發表於2018-12-27

轉載:難得可貴的好文章

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
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關文章