1. 程式人生 > >非spring元件servlet、filter、interceptor中注入spring bean

非spring元件servlet、filter、interceptor中注入spring bean

問題:在filter和interceptor中經常需要呼叫Spring的bean,filter也是配置在web.xml中的,請問一下這樣呼叫的話,filter中呼叫Spring的某個bean,這個bean一定存在嗎?現在總是擔心filter呼叫bean的時候,bean還沒被例項化?

答案:因為spring bean、filter、interceptor載入順序與它們在 web.xml 檔案中的先後順序無關。即不會因為 filter 寫在 listener 的前面而會先載入 filter。最終得出的結論是: ServletContext -> listener -> filter -> servlet 

由於spring bean的初始化是在listener中宣告的,因此filter時,spring bean已經例項。 

注入bean方法:

一、自定義一個工具類,在工具類中通過ApplicationContext獲取bean

  自定義一個工具類,實現自ApplicationContextAware介面,介面的方法是setApplicationContext,我們實現它,並讓其為我們服務,因為Spring在load自己的時候會將上下文環境填充進來。我們所要做的就是將得到的ApplicationContext儲存下來用。

@Component
public class SpringUtil implements
ApplicationContextAware { private static Logger log = LoggerFactory.getLogger(SpringUtil.class); /** * 當前IOC */ private static ApplicationContext applicationContext; /* * @param arg0 * * @throws BeansException * * @see * org.springframework.context.ApplicationContextAware#setApplicationContext * (org.springframework.context.ApplicationContext)
*/ @Override public void setApplicationContext(ApplicationContext arg0) throws BeansException { log.info("====================arg0:"+arg0); applicationContext = arg0; } public static <T>T getBean(String id,Class<T> type){ return applicationContext.getBean(id,type); } }

需要注意的是該工具類需要納入spring的bean管理(註解:增加掃描配置component-scan或bean.xml中配置)喲,否則applicationContext 將會是空的。

二、自定義一個工具類,在工具類中通過BeanFactory 獲取bean

  自定義一個工具類,實現自BeanFactoryAware 介面,介面的方法是setBeanFactory,我們實現它,並讓其為我們服務,因為Spring在load自己的時候會將上下文環境填充進來。我們所要做的就是將得到的BeanFactory 儲存下來用。

@Component
public class BeanHelper implements BeanFactoryAware {
    
    private static BeanFactory beanFactory;

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    public static <T>T getBean(String id,Class<T> type){        
        return  beanFactory.getBean(id,type);
    }
}

同樣,需要注意的是該工具類需要納入spring的bean管理(註解:增加掃描配置component-scan或bean.xml中配置)喲,否則applicationContext 將會是空的。

二、使用了註解和靜態化的方式來產生SpringFactory物件

  上文的方法有個麻煩的地方:需要配置。而Spring2.5及之後的版本實際上加入了註解的方式進行依賴項的注入,使用如下程式碼也許更好:

public class SpringWiredBean extends SpringBeanAutowiringSupport {
    
    /**
     * 自動裝配註解會讓Spring通過型別匹配為beanFactory注入示例
     */
    @Autowired
    private BeanFactory beanFactory;

    private SpringWiredBean() {
    }

    private static SpringWiredBean instance;

    static {
        // 靜態塊,初始化例項
        instance = new SpringWiredBean();
    }

    /**
     * 例項方法 使用的時候先通過getInstance方法獲取例項
     * 
     * @param beanId
     * @return
     */
    public <T>T getBean(String id,Class<T> type){        
        return  beanFactory.getBean(id,type);
    }

    public static SpringWiredBean getInstance() {
        return instance;
    }
}

但是要增加一個掃描,讓spring能知道註解:

<context:component-scan base-package="org.ahe"></context:component-scan>

servlet中注入bean的方法

步驟:

1 配置spring檔案

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"> 
   <property name="sessionFactory" ref="sessionFactory"></property>
 </bean> 
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
   <property name="dataSource" ref="dataSource" />
 </bean>

2 在web.xml中載入spring的配置檔案

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>
   classpath*:/spring/applicationContext_*.xml
  </param-value>
 </context-param>

3 在servlet中獲取名字為jdbcTemplat的bean.

public class UserAuthorizationFilter extends HttpServlet {

private WebApplicationContext wac;

    public void init(){
        //方法一:
       wac =WebApplicationContextUtils.getRequiredWebApplicationContext(

             this.getServletContext());

        //方法二:
        wac = WebApplicationContextUtils.getWebApplicationContext(
          this.getServletContext());

       //方法一和方法二得到的結果是一樣的。

     //wac的型別:
      org.springframework.web.context.support.XmlWebApplicationContext

    }

public void doPost(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {

     JdbcTemplate jdbcTemplate = (JdbcTemplate)wac.getBean("jdbcTemplate");

     String sql="select count(*) from customer where name='liwj' and password='1111111'";

     int num=jdbcTemplate.queryForInt(sql);
     if(num==1){   
       System.out.println("has");
      }else{   
      System.out.println("hasnot");     

   }

}

相關推薦

spring元件servletfilterinterceptor注入spring bean

問題:在filter和interceptor中經常需要呼叫Spring的bean,filter也是配置在web.xml中的,請問一下這樣呼叫的話,filter中呼叫Spring的某個bean,這個bean一定存在嗎?現在總是擔心filter呼叫bean的時候,bean還沒被例項化? 答案:因為spring

Spring Boot-- ServletFilterListenerInterceptor

Spring Boot-- Servlet、Filter、Listener、Interceptor 在Spring Boot中讓Servlet、Listener、Filter生效的方法: 在Application上使用@ServletComponentSc

Spring Boot 註冊Servlet三大元件ServletFilterListener

由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案 public class MyServlet extends HttpServlet { protected void doPost(HttpS

013-Spring Boot web【二】靜態資源ServletFilterlistenter

ces 其中 bean response cat 使用 修改配置 dac tostring 一、靜態資源 1.1、webapp默認支持靜態資源 在src/main/webapp下建立user.html默認支持訪問 1.2、默認內置靜態資源目錄。可被直接訪問 查看包:

spring boot 攔截 以及Filterinterceptor Aspect區別

spring boot 攔截 以及Filter和interceptor 、Aspect區別        今天學習一下RESTFul api攔截           大概有三種方式

SpringBoot1.5.12.RELEASE註冊Servlet三大元件ServletFilterListener】

SpringBoot1.5.12.RELEASE註冊Servlet三大元件【Servlet、Filter、Listener】 1.理由:由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案。 2.註

spring的Aspect,FilterInterceptorControllerAdvice區別

1、filter,這是java的過濾器,和框架無關的,是所有過濾元件中最外層的,從粒度來說是最大的。 配置方式,有直接實現[email protected],@[email protected](第三方的filter) 2、interceptor,sp

Spring Boot學習筆記(二)使用ServletFilterListener

Servlet 還是得整合HttpServlet,然後重寫父類方法。 類的上方增加了@WebServlet註解,其實就是代替了xml的配置,可以被spring boot掃描、註冊到。 package org.test.Controll; import javax.servlet.Servl

23 Servlet三大元件(ServletFilterListener)註冊

1 傳統註冊方式 1.1 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="

JavaWeb三大元件ServletFilterListener)

JavaWeb三大元件指的是:Servlet、Filter、Listener,這三個元件在JavaWeb開發中分別提供不同的功能,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我),很難接觸到第三個元件,因此對原始JavaWeb開

JavaWeb三大元件——ServletFilterListener

JavaWeb三大元件指的是:Servlet、Filter、Listener,這三個元件在JavaWeb開發中分別提供不同的功能,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我),很難接觸到第三個元件,因此對原始JavaWeb開發還不夠熟悉,在這

玩轉Spring Boot 註冊ServletFilterListener

玩轉Spring Boot 註冊Servlet、Filter、Listener JAVA架構師Ya七月 2019-0

Spring Boot 2.X(十):自定義註冊 ServletFilterListener

前言 在 Spring Boot 中已經移除了 web.xml 檔案,如果需要註冊新增 Servlet、Filter、Listener 為 Spring Bean,在 Spring Boot 中有兩種方式: 使用 Servlet 3.0 API 的註解 @WebServlet、@WebFilter、@Lis

Java Web組件ServletFilterListener

繼承 一個 tex 請求 父類 服務器 監聽 alt tco 一、Servlet 類javax.servlet.http.HttpServlet; 1.是單例模式,一個web容器中只有一個實例。服務器調用它的service方法進行請求處理, service方法

Web開發ListenerFilterServlet的初始化及調用

children tomcat啟動 什麽 lis exceptio try 部分 OS findchild 我們在使用Spring+SpringMVC開發項目中,web.xml中一般的配置如下: 1 <?xml version="1.0" encoding=

Servlet – ListenerFilterDecorator

ide info sha sys nstat blog rep etl 級別 Listener-監聽器Listener為在Java Web中進行事件驅動編程提供了一整套事件類和監聽器接口.Listener監聽的事件源分為ServletContext/HttpSession/

javalistenerfilterinterceptor作用和區別

原文出自https://blog.csdn.net/Jintao_Ma/article/details/52972482 JavaWeb中監聽器+過濾器+攔截器區別、配置和實際應用 1.前言 上一篇文章提到在web.xml中各個元素的執行順序是這樣的,context-param-->

tomcat web.xml 的listener filterservlet 載入順序及其詳解

在專案中總會遇到一些關於載入的優先順序問題,剛剛就遇到了一個問題,由於專案中使用了quartz任務排程,quartz在web.xml中是使用listener進行監聽的,使得在tomcat啟動的時候能馬上檢查資料庫檢視那些任務未被按時執行,而資料庫的配置資訊在是在web.xml中使用servlet配置

JavaWeb 三大器--ListenerFilterInterceptor 總結

說明:web.xml的載入順序是:【Context-Param】->【Listener】->【Filter】->【Servlet】,而同個型別之間的實際程式呼叫的時候的順序是根據對應的Mapping的順序進行呼叫。 詳細介紹:web.xml載入順序與web.xml常用節點解析 轉自:ht

SpringBoot初始教程之ServletFilterListener配置

1.介紹通過之前的文章來看,SpringBoot涵蓋了很多配置,但是往往一些配置是採用原生的Servlet進行的,但是在SpringBoot中不需要配置web.xml的 因為有可能打包之後是一個jar包的形式,這種情況下如何解決?SpringBoot 提供了兩種方案進行解決 2.快速開始2.1 方案一方案一