淺析Java的Spring框架中IOC容器容器的應(yīng)用
Spring容器是Spring框架的核心。容器將創(chuàng)建對(duì)象,它們連接在一起,配置它們,并從創(chuàng)建到銷毀管理他們的整個(gè)生命周期。在Spring容器使用依賴注入(DI)來管理組成應(yīng)用程序的組件。這些對(duì)象被稱為Spring Beans。
容器獲得其上的哪些對(duì)象進(jìn)行實(shí)例化,配置和組裝通過閱讀提供的配置元數(shù)據(jù)的說明。配置元數(shù)據(jù)可以通過XML,Java注釋或Java代碼來表示。下面的圖是Spring如何工作的高層次圖。 Spring IoC容器是利用Java的POJO類和配置元數(shù)據(jù)的產(chǎn)生完全配置和可執(zhí)行的系統(tǒng)或應(yīng)用程序。
Spring提供了BeanFactory和ApplicationContext兩種不同類型的容器:
BeanFactory容器
這是最簡(jiǎn)單的容器提供DI的基本支持,并由org.springframework.beans.factory.BeanFactory 接口中定義。BeanFactory或者相關(guān)的接口,例如實(shí)現(xiàn)BeanFactoryAware,InitializingBean,DisposableBean,仍然存在在Spring向后兼容性與大量的 Spring 整合第三方框架的目的。
有相當(dāng)數(shù)量的接口來提供直出隨取即用的Spring 的 BeanFactory接口的實(shí)現(xiàn)。最常用BeanFactory 實(shí)現(xiàn)的是 XmlBeanFactoryclass。此容器從XML文件中讀取配置元數(shù)據(jù),并使用它來創(chuàng)建一個(gè)完全配置的系統(tǒng)或應(yīng)用程序。
BeanFactory中通常是首選的資源,如移動(dòng)設(shè)備或基于applet的應(yīng)用受到限制。因此,使用一個(gè)ApplicationContext,除非你有一個(gè)很好的理由不這樣做。
例如:
讓我們使用 Eclipse IDE,然后按照下面的步驟來創(chuàng)建一個(gè)Spring應(yīng)用程序:
這里是HelloWorld.java文件的內(nèi)容:
package com.yiibai; public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); } }
下面是第二個(gè)文件 MainApp.java 的內(nèi)容:
package com.yiibai; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; public class MainApp { public static void main(String[] args) { XmlBeanFactory factory = new XmlBeanFactory (new ClassPathResource("Beans.xml")); HelloWorld obj = (HelloWorld) factory.getBean("helloWorld"); obj.getMessage(); } }
有以下兩個(gè)要點(diǎn)需要注意在主要程序中:
第一步是創(chuàng)建工廠對(duì)象,我們使用的框架API XmlBeanFactory() 來創(chuàng)建工廠bean,并使用ClassPathResource() API來加載在CLASSPATH中可用的bean配置文件。在API 需要 XmlBeanFactory() 創(chuàng)建和初始化所有對(duì)象。在配置文件中提到的 bean 類。
第二個(gè)步驟是用來使用創(chuàng)建的bean工廠對(duì)象的 getBean() 方法獲得所需的 bean。此方法使用bean 的 id 返回,最終可以構(gòu)造到實(shí)際對(duì)象的通用對(duì)象。一旦有了對(duì)象,就可以使用這個(gè)對(duì)象調(diào)用任何類方法。
以下是bean配置文件beans.xml中的內(nèi)容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld" class="com.yiibai.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans>
一旦創(chuàng)建源和bean配置文件來完成,讓我們運(yùn)行應(yīng)用程序。如果一切順利,您的應(yīng)用程序,這將打印以下信息:
Your Message : Hello World!
ApplicationContext容器
應(yīng)用程序上下文(Application Context)是Spring更先進(jìn)的容器。以它的BeanFactory類似可以加載bean定義,并根據(jù)要求分配bean。此外,它增加了更多的企業(yè)特定的功能,例如從一個(gè)屬性文件解析文本消息的能力,并發(fā)布應(yīng)用程序事件感興趣的事件監(jiān)聽器的能力。此容器是由org.springframework.context.ApplicationContext 接口定義。
ApplicationContext 包括了 BeanFactory 所有的功能,因此通常建議在 BeanFactory。 BeanFactory中仍然可以用于重量輕的應(yīng)用,如移動(dòng)裝置或基于小應(yīng)用程序的應(yīng)用程序。
最常用的 ApplicationContext 實(shí)現(xiàn)是:
FileSystemXmlApplicationContext: 這個(gè)容器加載從一個(gè)XML文件中的bean的定義。在這里,你需要提供給構(gòu)造函數(shù)中的XML bean配置文件的完整路徑。
ClassPathXmlApplicationContext 這個(gè)容器加載從一個(gè)XML文件中的bean的定義。在這里,您不需要提供XML文件的完整路徑,但你需要正確設(shè)置CLASSPATH,因?yàn)檫@個(gè)容器會(huì)看在CLASSPATH中bean的XML配置文件.
WebXmlApplicationContext: 此容器加載所有的bean從Web應(yīng)用程序中定義的XML文件。
我們已經(jīng)看到在Spring 的Hello World示例ClassPathXmlApplicationContext容器的例子,我們將更多地談?wù)揦mlWebApplicationContext 在一個(gè)單獨(dú)的章節(jié)時(shí),我們將討論基于Web的Spring應(yīng)用程序。所以,讓我們看到FileSystemXmlApplicationContext一個(gè)例子。
例子:
我們使用Eclipse IDE,然后按照下面的步驟來創(chuàng)建一個(gè) Spring 應(yīng)用程序:
這里是HelloWorld.java 文件的內(nèi)容:
package com.yiibai; public class HelloWorld { private String message; public void setMessage(String message){ this.message = message; } public void getMessage(){ System.out.println("Your Message : " + message); } }
下面是第二個(gè)文件MainApp.java 的內(nèi)容:
package com.yiibai; import org.springframework.context.ApplicationContext; import org.springframework.context.support.FileSystemXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new FileSystemXmlApplicationContext ("C:/Users/ZARA/workspace/HelloSpring/src/Beans.xml"); HelloWorld obj = (HelloWorld) context.getBean("helloWorld"); obj.getMessage(); } }
有以下兩個(gè)要點(diǎn)需要注意在主要程序中:
第一步是創(chuàng)建工廠對(duì)象,我們使用的框架API的 FileSystemXmlApplicationContext來從給定的路徑加載bean配置文件之后,創(chuàng)建工廠bean。API的FileSystemXmlApplicationContext()需要?jiǎng)?chuàng)建和初始化所有的對(duì)象。在XML bean配置文件中提到的bean類。
第二個(gè)步驟是用來使用創(chuàng)建的上下文的getBean()方法獲得所需的bean。此方法使用bean的id返回,最終可以構(gòu)造到實(shí)際對(duì)象的通用對(duì)象。一旦有了對(duì)象,我們就可以使用這個(gè)對(duì)象調(diào)用任何類方法。
以下是bean配置文件beans.xml中的內(nèi)容
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloWorld" class="com.yiibai.HelloWorld"> <property name="message" value="Hello World!"/> </bean> </beans>
一旦創(chuàng)建源代碼和bean配置文件完成,讓我們運(yùn)行應(yīng)用程序。如果一切順利,這將打印以下信息:
Your Message : Hello World!
總結(jié)
在ApplicationContext 容器包括BeanFactory的容器的所有功能,所以因此通常建議在BeanFactory。 BeanFactory仍然可以用于重量輕的應(yīng)用,如移動(dòng)裝置或基于小應(yīng)用程序的應(yīng)用中的數(shù)據(jù)量和速度是顯著。
相關(guān)文章
SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于SpringBoot如何進(jìn)行業(yè)務(wù)校驗(yàn)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-01-01SpringBoot @Import與@Conditional注解使用詳解
在了解spring boot自動(dòng)配置原理前,再來了解下兩個(gè)注解@Import注解和@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的條件進(jìn)行判斷,滿足條件給容器注冊(cè)bean2022-10-10Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案
今天小編就為大家分享一篇關(guān)于Java找不到或無法加載主類及編碼錯(cuò)誤問題的解決方案,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02SpringCloud Config配置中心原理以及環(huán)境切換方式
這篇文章主要介紹了SpringCloud Config配置中心原理以及環(huán)境切換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03