java Filter 中注入 Service

問題: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還沒初始化,沒法注入。

一堆!!沒毛病(相信大家在看到我這篇之前,就已經看了,但是看完了,沒解決,,可以試下我的方法 O(∩_∩)O!)

一:先在Filter 添加bean;工具類:SpringUtils

  注意:此工具類必須在filter文件夾下(下圖所示)

  

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @author yqb
 * @date 2018年9月29日
 * @version 1.0
 */
@Component
public class SpringUtils implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        if (SpringUtils.applicationContext == null) {
            SpringUtils.applicationContext = applicationContext;
        }

    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    //根據name
    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);
    }

}

二:在LoginFilter中添加:

@Autowired
private AdminUserService adminUserService;

  添加bean,命名可以自定

if (adminUseService == null) {
      adminUserService = (AdminUserService) SpringUtils.getBean("adminUserService");
 }

三:在 配置文件(applixationContext.xml)配置下包名

    <context:component-scan
            base-package="com.ong.controller,
            com.ong.service,
            com.ong.filter">
    </context:component-scan>

   之前配置了controller和service,,,filter於controller和service是同級包,,

   

    LoginFilter.java在包filter下,然後我們就可以調用userService中的方法了:

    JSONObject data =userService.userLogin(userName,passWord);

參考:https://blog.csdn.net/Evan_QB/article/details/82894834

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

ps:     有什麼不清楚的可以評論哦。

          才疏學淺 ,請多指教 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章