非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 implementsApplicationContextAware { 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元件servlet、filter、interceptor中注入spring bean
問題:在filter和interceptor中經常需要呼叫Spring的bean,filter也是配置在web.xml中的,請問一下這樣呼叫的話,filter中呼叫Spring的某個bean,這個bean一定存在嗎?現在總是擔心filter呼叫bean的時候,bean還沒被例項化? 答案:因為spring
Spring Boot-- Servlet、Filter、Listener、Interceptor
Spring Boot-- Servlet、Filter、Listener、Interceptor 在Spring Boot中讓Servlet、Listener、Filter生效的方法: 在Application上使用@ServletComponentSc
Spring Boot 、註冊Servlet三大元件Servlet、Filter、Listener
由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案 public class MyServlet extends HttpServlet { protected void doPost(HttpS
013-Spring Boot web【二】靜態資源、Servlet、Filter、listenter
ces 其中 bean response cat 使用 修改配置 dac tostring 一、靜態資源 1.1、webapp默認支持靜態資源 在src/main/webapp下建立user.html默認支持訪問 1.2、默認內置靜態資源目錄。可被直接訪問 查看包:
spring boot 攔截 以及Filter和interceptor 、Aspect區別
spring boot 攔截 以及Filter和interceptor 、Aspect區別 今天學習一下RESTFul api攔截 大概有三種方式
SpringBoot1.5.12.RELEASE註冊Servlet三大元件【Servlet、Filter、Listener】
SpringBoot1.5.12.RELEASE註冊Servlet三大元件【Servlet、Filter、Listener】 1.理由:由於SpringBoot預設是以jar包的方式啟動嵌入式的Servlet容器來啟動SpringBoot的web應用,沒有web.xml檔案。 2.註
spring的Aspect,Filter、Interceptor、ControllerAdvice區別
1、filter,這是java的過濾器,和框架無關的,是所有過濾元件中最外層的,從粒度來說是最大的。 配置方式,有直接實現[email protected],@[email protected](第三方的filter) 2、interceptor,sp
Spring Boot學習筆記(二)使用Servlet、Filter、Listener
Servlet 還是得整合HttpServlet,然後重寫父類方法。 類的上方增加了@WebServlet註解,其實就是代替了xml的配置,可以被spring boot掃描、註冊到。 package org.test.Controll; import javax.servlet.Servl
23 Servlet三大元件(Servlet、Filter、Listener)註冊
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三大元件(Servlet、Filter、Listener)
JavaWeb三大元件指的是:Servlet、Filter、Listener,這三個元件在JavaWeb開發中分別提供不同的功能,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我),很難接觸到第三個元件,因此對原始JavaWeb開
JavaWeb三大元件——Servlet、Filter、Listener
JavaWeb三大元件指的是:Servlet、Filter、Listener,這三個元件在JavaWeb開發中分別提供不同的功能,然而很多人可能只用過其中一個或者兩個(Servlet、Filter,比如我),很難接觸到第三個元件,因此對原始JavaWeb開發還不夠熟悉,在這
玩轉Spring Boot 註冊Servlet、Filter、Listener
玩轉Spring Boot 註冊Servlet、Filter、Listener JAVA架構師Ya七月 2019-0
Spring Boot 2.X(十):自定義註冊 Servlet、Filter、Listener
前言 在 Spring Boot 中已經移除了 web.xml 檔案,如果需要註冊新增 Servlet、Filter、Listener 為 Spring Bean,在 Spring Boot 中有兩種方式: 使用 Servlet 3.0 API 的註解 @WebServlet、@WebFilter、@Lis
Java Web組件Servlet、Filter、Listener
繼承 一個 tex 請求 父類 服務器 監聽 alt tco 一、Servlet 類javax.servlet.http.HttpServlet; 1.是單例模式,一個web容器中只有一個實例。服務器調用它的service方法進行請求處理, service方法
Web開發中Listener、Filter、Servlet的初始化及調用
children tomcat啟動 什麽 lis exceptio try 部分 OS findchild 我們在使用Spring+SpringMVC開發項目中,web.xml中一般的配置如下: 1 <?xml version="1.0" encoding=
Servlet – Listener、Filter、Decorator
ide info sha sys nstat blog rep etl 級別 Listener-監聽器Listener為在Java Web中進行事件驅動編程提供了一整套事件類和監聽器接口.Listener監聽的事件源分為ServletContext/HttpSession/
java中listener、filter、interceptor作用和區別
原文出自https://blog.csdn.net/Jintao_Ma/article/details/52972482 JavaWeb中監聽器+過濾器+攔截器區別、配置和實際應用 1.前言 上一篇文章提到在web.xml中各個元素的執行順序是這樣的,context-param-->
tomcat 中 web.xml 中的listener、 filter、servlet 載入順序及其詳解
在專案中總會遇到一些關於載入的優先順序問題,剛剛就遇到了一個問題,由於專案中使用了quartz任務排程,quartz在web.xml中是使用listener進行監聽的,使得在tomcat啟動的時候能馬上檢查資料庫檢視那些任務未被按時執行,而資料庫的配置資訊在是在web.xml中使用servlet配置
JavaWeb 三大器--Listener、Filter 和Interceptor 總結
說明:web.xml的載入順序是:【Context-Param】->【Listener】->【Filter】->【Servlet】,而同個型別之間的實際程式呼叫的時候的順序是根據對應的Mapping的順序進行呼叫。 詳細介紹:web.xml載入順序與web.xml常用節點解析 轉自:ht
SpringBoot初始教程之Servlet、Filter、Listener配置
1.介紹通過之前的文章來看,SpringBoot涵蓋了很多配置,但是往往一些配置是採用原生的Servlet進行的,但是在SpringBoot中不需要配置web.xml的 因為有可能打包之後是一個jar包的形式,這種情況下如何解決?SpringBoot 提供了兩種方案進行解決 2.快速開始2.1 方案一方案一