欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Spring獲取bean方法小結(jié)

 更新時(shí)間:2016年01月10日 11:08:21   投稿:mrr  
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,如何在程序中獲取Spring配置的bean呢?下面通過本文給大家介紹Java中Spring獲取bean方法小結(jié),對(duì)spring獲取bean方法相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧

Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架,如何在程序中獲取Spring配置的bean呢?

Bean工廠(com.springframework.beans.factory.BeanFactory)是Spring框架最核心的接口,它提供了高級(jí)IoC的配置機(jī)制。BeanFactory使管理不同類型的Java對(duì)象成為可能,應(yīng)用上下文(com.springframework.context.ApplicationContext)建立在BeanFactory基礎(chǔ)之上,提供了更多面向應(yīng)用的功能,它提供了國際化支持和框架事件體系,更易于創(chuàng)建實(shí)際應(yīng)用。我們一般稱BeanFactory為IoC容器,而稱ApplicationContext為應(yīng)用上下文。但有時(shí)為了行文方便,我們也將ApplicationContext稱為Spring容器。

對(duì)于兩者的用途,我們可以進(jìn)行簡單劃分:BeanFactory是Spring框架的基礎(chǔ)設(shè)施,面向Spring本身;ApplicationContext面向使用Spring框架的開發(fā)者,幾乎所有的應(yīng)用場合我們都直接使用ApplicationContext而非底層的BeanFactory。

ApplicationContext的初始化和BeanFactory有一個(gè)重大的區(qū)別:BeanFactory在初始化容器時(shí),并未實(shí)例化Bean,直到第一次訪問某個(gè)Bean時(shí)才實(shí)例目標(biāo)Bean;而ApplicationContext則在初始化應(yīng)用上下文時(shí)就實(shí)例化所有單實(shí)例的Bean。因此ApplicationContext的初始化時(shí)間會(huì)比BeanFactory稍長一些

本文不涉及通過 @Resource 、 @Autowired 自動(dòng)注入,僅僅通過 ApplicationContext 獲取 Sping 配置文件中的 Bean 。

要獲取XML中配置的Bean,最關(guān)鍵的是獲取org.springframework.context.ApplicationContext

第一種獲取 ApplicationContext 的方法:

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");

或者

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
private ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

這種方式實(shí)例化applicationContext是非常耗時(shí)的,這種方式適用于采用Spring框架的獨(dú)立應(yīng)用程序,僅僅推薦使用在程序需要通過配置文件手工初始化Spring的情況。ApplicationContext的主要實(shí)現(xiàn)類是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext,前者默認(rèn)從類路徑加載配置文件,后者默認(rèn)從文件系統(tǒng)中裝載配置文件

例子:

public class BeanManager {
private static ApplicationContext context = new ClassPathXmlApplicationContext("appcontext.xml") ;
public static Object getBean(String beanId) {
return context.getBean(beanId);
}
}

在 web.xml 中寫一個(gè) servlet ,自動(dòng)啟動(dòng), init 方法中調(diào)用一下 BeanManager

init() throws ServletException {
BeanManager bm = new BeanManager();//可選的,為的是在 web 應(yīng)用啟動(dòng)的時(shí)候就讓 spring 加載 bean 配置。
// 否則會(huì)在第一次調(diào)用 BeanManager 的時(shí)候加載,影響一次速度。
}

在 java 代碼中使用 BeanManager.getBean(String beanId); 來獲得 bean 實(shí)例。

第二種獲取 ApplicationContext 的方法: 通過Spring提供的工具類獲取ApplicationContext對(duì)象,專為web工程定制的方法,推薦Web項(xiàng)目中使用。例如:

ServletContext servletContext = request.getSession().getServletContext();
ApplicationContext ac1 = WebApplicationContextUtils .getRequiredWebApplicationContext(ServletContext sc)
ApplicationContext ac2 = WebApplicationContextUtils .getWebApplicationContext(ServletContext sc)
ac1.getBean("beanId");
ac2.getBean("beanId");

通過javax.servlet.ServletContext 獲取到ApplicationContext實(shí)例對(duì)象,這意味著,必須使用到request、session等等。

這樣,就不能把ApplicationContext對(duì)象設(shè)置為成員變量。需要在每個(gè)具體的方法中通過request、session等獲取到ServletContext再獲取ApplicationContext實(shí)例。

因此,此方法僅僅推薦使用在可以獲取到ServletContext對(duì)象的Web項(xiàng)目中,并且不需要將ApplicationContext對(duì)象定義為成員變量的情況下。

注意:當(dāng)使用WebApplicationContextUtils獲取ApplicationContext實(shí)例時(shí),需要在web.xml配置文件中添加org.springframework.web.context.ContextLoaderListener監(jiān)聽器,否則獲取不到ApplicationContext對(duì)象,返回Null。

配置文件:web.xml

<!--ContextLoaderListener自動(dòng)注入 applicationContext,通過
WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext())獲取 -->
<!--Spring配置文件加載位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appContext.xml,/WEB-INF/spring/appInterceptor.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

3. 繼承自抽象類ApplicationObjectSupport

抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。Spring初始化時(shí),會(huì)通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對(duì)象注入。

4. 繼承自抽象類WebApplicationObjectSupport

通過繼承org.springframework.web.context.support.WebApplicationObjectSupport使用getWebApplicationContext() 獲取到org.springframework.web.context.WebApplicationContext由于Web應(yīng)用比一般的應(yīng)用擁有更多的特性,因此WebApplicationContext擴(kuò)展了ApplicationContext。WebApplicationContext定義了一個(gè)常量ROOT_WEB_APPLICATION_ CONTEXT_ATTRIBUTE,在上下文啟動(dòng)時(shí),WebApplicationContext實(shí)例即以此為鍵放置在ServletContext的屬性列表中,因此我們可以直接通過以下語句從Web容器中獲取WebApplicationContext:

WebApplicationContext wac = (WebApplicationContext)servletContext.getAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

5. 實(shí)現(xiàn)接口ApplicationContextAware

實(shí)現(xiàn)該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對(duì)象。Spring初始化時(shí),會(huì)通過該方法將ApplicationContext 對(duì)象注入。

第三、四、五種方法都需要將類配置在 Spring 配置文件中:

<!--假定ApplicationContextTool為繼承或者實(shí)現(xiàn)了第三、四、五種方法的具體實(shí)現(xiàn)類-->
<bean class="com.twovv.utils.ApplicationContextTool"></bean>

否則將獲取不到 ApplicationContext ,返回 Null 。

以上內(nèi)容給大家介紹了Java中Spring獲取bean方法小結(jié),希望大家喜歡。

相關(guān)文章

  • 如何開發(fā)一個(gè)簡單的Akka Java應(yīng)用

    如何開發(fā)一個(gè)簡單的Akka Java應(yīng)用

    這篇文章主要介紹了如何開發(fā)一個(gè)簡單的Akka Java應(yīng)用 ,幫助大家使用Java創(chuàng)建Akka項(xiàng)目并將其打包,感興趣的朋友可以了解下
    2020-10-10
  • Java 字符串連接的性能問題分析

    Java 字符串連接的性能問題分析

    這篇文章主要介紹了Java 字符串連接的性能問題分析的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • Java Socket編程(五) 簡單的WEB服務(wù)器

    Java Socket編程(五) 簡單的WEB服務(wù)器

    Java Socket編程(五) 簡單的WEB服務(wù)器...
    2006-12-12
  • 教你用springboot連接mysql并實(shí)現(xiàn)增刪改查

    教你用springboot連接mysql并實(shí)現(xiàn)增刪改查

    今天教各位小伙伴用springboot連接mysql并實(shí)現(xiàn)增刪改查功能,文中有非常詳細(xì)的步驟及代碼示例,對(duì)正在學(xué)習(xí)Java的小伙伴們有非常好的幫助,需要的朋友可以參考下
    2021-05-05
  • Springboot中的@ComponentScan注解使用解析

    Springboot中的@ComponentScan注解使用解析

    這篇文章主要介紹了Springboot中的@ComponentScan注解使用解析,@ComponentScan用于類或接口上主要是指定掃描路徑,spring會(huì)把指定路徑下帶有指定注解的類注冊(cè)到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • 基于idea Maven中的redis配置使用詳解

    基于idea Maven中的redis配置使用詳解

    這篇文章主要介紹了基于idea Maven中的redis配置使用,包括一些配置文件需要的內(nèi)容,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • 深入理解Spring Cloud Zuul過濾器

    深入理解Spring Cloud Zuul過濾器

    這篇文章主要給大家介紹了關(guān)于Spring Cloud Zuul過濾器的相關(guān)資料,通過閱讀本文您將了解:Zuul過濾器類型與請(qǐng)求生命周期、如何編寫Zuul過濾器、如何禁用Zuul過濾器和Spring Cloud為Zuul編寫的過濾器及其功能,需要的朋友可以參考下。
    2017-02-02
  • Java實(shí)現(xiàn)MD5消息摘要算法

    Java實(shí)現(xiàn)MD5消息摘要算法

    本篇文章主要介紹了Java實(shí)現(xiàn)MD5消息摘要算法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • 基于SpringMVC入門案例及講解

    基于SpringMVC入門案例及講解

    這篇文章主要介紹了基于SpringMVC入門案例及講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java 中復(fù)合機(jī)制的實(shí)例詳解

    java 中復(fù)合機(jī)制的實(shí)例詳解

    這篇文章主要介紹了java 中復(fù)合機(jī)制的實(shí)例詳解的相關(guān)資料,希望通過本文大家能了解繼承和復(fù)合的區(qū)別并應(yīng)用復(fù)合這種機(jī)制,需要的朋友可以參考下
    2017-09-09

最新評(píng)論