javascript
Spring简介与IOC容器
一、Spring簡介
開源:源碼公開、免費(fèi)試用;
簡化:簡化企業(yè)級開發(fā)。
解耦:耦合度降低、可插拔,便于后續(xù)維護(hù)更新升級拓展。
二、Sping核心模塊
?
Spring 框架的這些模塊可以滿足一切企業(yè)級應(yīng)用開發(fā)的需求,在開發(fā)過程中可以根據(jù)需求有選擇性地使用所需要的模塊。
官網(wǎng):Spring | Home
Core 核心模塊:提供了 Spring 框架的基本組成部分,包括 IoC 和 DI 功能。
Context 上下文模塊:建立在核心和 Beans 模塊的基礎(chǔ)之上,它是訪問定義和配置任何對象的媒介。ApplicationContext 接口是上下文模塊的焦點(diǎn)。
三、Spring IOC
1、基礎(chǔ)概念
容器:Spring 是一個(gè)容器,因?yàn)樗?span style="color:#FF0000;">包含并且管理應(yīng)用對象的生命周期。
控制反轉(zhuǎn):IOC (Inversion of Control),指的是將對象的創(chuàng)建權(quán)交給 Spring 去創(chuàng)建。
使用 Spring 之前,對象的創(chuàng)建都是由我們自己在代碼中 new 創(chuàng)建。而使用 Spring之后。對象的創(chuàng)建都是由給了 Spring 框架。
IOC (Inversion of Control) 是指在程序開發(fā)中,對象實(shí)例的創(chuàng)建不再由調(diào)用者管理,而是由 Spring 容器創(chuàng)建。Spring 容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系,而不是由程序代碼直接控制,因此,控制權(quán)由程序代碼轉(zhuǎn)移到了 Spring 容器中,控制權(quán)發(fā)生了反轉(zhuǎn),這就是 Spring 的 IOC 思想。
IOC容器的概念:IOC 容器就是具有依賴注入功能的容器,IOC 容器負(fù)責(zé)實(shí)例化、定位、配置應(yīng)用程序中的對象及建立這些對象間的依賴。應(yīng)用程序無需直接在代碼中 new 相關(guān)的對象,應(yīng)用程序由 IOC 容器進(jìn)行組裝。在 Spring 中 BeanFactory 是 IOC 容器的實(shí)際代表者。
Bean的概念:在 Spring 中,被 Spring 容器所管理的對象稱之為”Bean”對象。一個(gè) Spring 的 Bean 對象可以是任何形式的 POJO。
依賴注入:DI (Dependency Injection),是指依賴的對象不需要手動(dòng)調(diào)用 setXX 方法去設(shè)置,而是通過配置賦值。
2、核心API
SpringIOC容器類型:Spring 提供了兩種 IoC 容器,分別為 BeanFactory 和 ApplicationContext。
BeanFactory 是基礎(chǔ)類型的 IoC 容器。它由org.springframework.beans.facytory.BeanFactory 接口定義,并提供了完整的 IoC服務(wù)支持。簡單來說, BeanFactory 就是一個(gè)管理 Bean 的工廠,它主要負(fù)責(zé)初始化各種Bean,并調(diào)用它們的生命周期方法。
ApplicationContext 是 BeanFactory 的子接口,也被稱為應(yīng)用上下文。
ClassPathXmlApplicationContext:該 類 從 類 路 徑 ClassPath 中 尋 找 指 定 的 XML 配 置 文 件 , 找 到 并 裝 載 完 成ApplicationContext 的實(shí)例化工作。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">ApplicationContext</span> <span style="color:#000000">applicationContext</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> ? <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#008855">String</span> <span style="color:#000000">configLocation</span>);</span></span>四、Spring IOC容器的使用
使用Spring之前的痛點(diǎn):對象自己創(chuàng)建,每次修改源碼都需要重新編譯,耦合度過高,不便于后續(xù)更新升級。
下面以找對象為例。
?
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">interface</span> <span style="color:#0000ff">GirlFriend</span> {<span style="color:#008855">void</span> <span style="color:#000000">say</span>(); }</span></span>實(shí)現(xiàn)類:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 吳俊峰找女朋友的標(biāo)準(zhǔn)</span> <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">GirlfriendImplWJF</span> <span style="color:#770088">implements</span> <span style="color:#000000">GirlFriend</span>{<span style="color:#555555">@Override</span><span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">say</span>() {<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"小峰峰"</span>);} }</span></span>實(shí)現(xiàn)類2:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 楊涵找女朋友的標(biāo)準(zhǔn)</span> <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">GirlfriendImplYh</span> <span style="color:#770088">implements</span> <span style="color:#000000">GirlFriend</span>{<span style="color:#555555">@Override</span><span style="color:#770088">public</span> <span style="color:#008855">void</span> <span style="color:#000000">say</span>() {<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#aa1111">"小涵涵"</span>);} }</span></span>測試:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">TestGirlfriend</span> {<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {<span style="color:#aa5500">/*GirlFriend gf = new GirlfriendImplWJF();</span><span style="color:#aa5500">gf.say();*/</span><span style="color:#aa5500">// 任玉濤要換成楊涵的標(biāo)準(zhǔn),強(qiáng)耦合,每次都需要修改源碼,重新編譯</span><span style="color:#000000">GirlFriend</span> <span style="color:#000000">gf</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">GirlfriendImplYh</span>();<span style="color:#000000">gf</span>.<span style="color:#000000">say</span>();} }</span></span>1、搭建項(xiàng)目
2、通過 IOC 容器管理 Bean 對象
2.1 配置主配置文件application_context.xml
?
配置內(nèi)容如下:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#555555"><?xml</span> <span style="color:#555555">version="1.0" encoding="UTF-8"?></span> <span style="color:#117700"><</span><span style="color:#117700">beans</span> <span style="color:#0000cc">xmlns</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans"</span><span style="color:#0000cc">xmlns:xsi</span>=<span style="color:#aa1111">"http://www.w3.org/2001/XMLSchema-instance"</span><span style="color:#0000cc">xsi:schemaLocation</span>=<span style="color:#aa1111">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"</span><span style="color:#117700">></span><span style="color:#aa5500"><!--scope屬性值:singleton表示單例模式(默認(rèn)值),prototype 表示原型--></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"girlFriendWJF"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.dyh.pojo.impl.GirlfriendImplWJF"</span><span style="color:#0000cc">scope</span>=<span style="color:#aa1111">"singleton"</span><span style="color:#117700">></span> ?<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"girlFriendYh"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.dyh.pojo.impl.GirlfriendImplYh"</span><span style="color:#0000cc">scope</span>=<span style="color:#aa1111">"prototype"</span><span style="color:#117700">></span> ?<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span> <span style="color:#117700"></</span><span style="color:#117700">beans</span><span style="color:#117700">></span></span></span>2.2 測試TestGirlfriendSpringIOC.java
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">package</span> <span style="color:#0000ff">com</span>.<span style="color:#000000">dyh</span>.<span style="color:#000000">test</span>; ? <span style="color:#770088">import</span> <span style="color:#000000">com</span>.<span style="color:#000000">dyh</span>.<span style="color:#000000">pojo</span>.<span style="color:#000000">iter</span>.<span style="color:#000000">GirlFriend</span>; <span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">ApplicationContext</span>; <span style="color:#770088">import</span> <span style="color:#000000">org</span>.<span style="color:#000000">springframework</span>.<span style="color:#000000">context</span>.<span style="color:#000000">support</span>.<span style="color:#000000">ClassPathXmlApplicationContext</span>; ? <span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">TestGirlfriendSpringIOC</span> {<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {<span style="color:#aa5500">// ac 是一個(gè)Spring IoC 容器,需要的時(shí)候去容器中獲取,不需要new</span><span style="color:#000000">ApplicationContext</span> <span style="color:#000000">ac</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#aa1111">"application_context.xml"</span>);<span style="color:#aa5500">//GirlFriend girlFriend = (GirlFriend) ac.getBean("girlFriendWJF");</span><span style="color:#aa5500">/*GirlFriend girlFriend = (GirlFriend) ac.getBean("girlFriendYh");</span><span style="color:#aa5500">girlFriend.say();</span><span style="color:#aa5500">System.out.println(girlFriend);</span><span style="color:#aa5500">girlFriend = (GirlFriend) ac.getBean("girlFriendYh");</span><span style="color:#aa5500">System.out.println(girlFriend);*/</span><span style="color:#000000">GirlFriend</span> <span style="color:#000000">girlFriend</span> <span style="color:#981a1a">=</span> (<span style="color:#000000">GirlFriend</span>) <span style="color:#000000">ac</span>.<span style="color:#000000">getBean</span>(<span style="color:#aa1111">"girlFriendWJF"</span>);<span style="color:#000000">girlFriend</span>.<span style="color:#000000">say</span>();<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">girlFriend</span>);<span style="color:#000000">girlFriend</span> <span style="color:#981a1a">=</span> (<span style="color:#000000">GirlFriend</span>) <span style="color:#000000">ac</span>.<span style="color:#000000">getBean</span>(<span style="color:#aa1111">"girlFriendWJF"</span>);<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">girlFriend</span>);} }</span></span>五、Spring IOC 容器創(chuàng)建 Bean 對象的三種方式
1、通過構(gòu)造方法創(chuàng)建Bean
上面案例就是,也就是如下配置,會(huì)調(diào)用GirlfriendImplYh類默認(rèn)的無參構(gòu)造方法實(shí)實(shí)例化對象得到id為girlFriendYh的一個(gè)Bean。
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"girlFriendYh"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.dyh.pojo.impl.GirlfriendImplYh"</span><span style="color:#0000cc">scope</span>=<span style="color:#aa1111">"prototype"</span><span style="color:#117700">></span> ?<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span></span></span>2、通過靜態(tài)工廠
2.1 靜態(tài)工廠類
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">GirlFriendFactory</span> {<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#000000">Girlfriend</span> <span style="color:#000000">getGirlFriendFJC</span>(){<span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">GirlfriendFJC</span>();}<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#000000">Girlfriend</span> <span style="color:#000000">getGirlFriendCWS</span>(){<span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">GirlfriendCWS</span>();} }</span></span>2.2 application_context.xml配置
靜態(tài)工廠內(nèi)部的方法都為靜態(tài)方法,靜態(tài)方法可以通過對象名直接方法,故不需要配置工廠相關(guān)的bean,只需要配置class和factory-method,也就是告訴Spring容器創(chuàng)建對象的時(shí)候使用那個(gè)工廠的哪個(gè)靜態(tài)方法,如下所示:
<span style="background-color:#f8f8f8"><span style="color:#333333"> ? ?<span style="color:#aa5500"><!--表示使用靜態(tài)工廠GirlFriendFactory的getGirlFriendFJC方法創(chuàng)建id為gf_Factory_fjc的對象--></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"gf_Factory_fjc"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.dyh.factory.GirlFriendFactory"</span><span style="color:#0000cc">factory-method</span>=<span style="color:#aa1111">"getGirlFriendFJC"</span><span style="color:#117700">></span> ?<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"gf_Factory_cws"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.dyh.factory.GirlFriendFactory"</span><span style="color:#0000cc">factory-method</span>=<span style="color:#aa1111">"getGirlFriendCWS"</span><span style="color:#117700">></span> ?<span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span></span></span>2.3 測試
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">TestGirlfriendSpringIoC</span> {<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {<span style="color:#000000">ApplicationContext</span> <span style="color:#000000">ac</span> <span style="color:#981a1a">=</span><span style="color:#770088">new</span> <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#aa1111">"application_context.xml"</span>);<span style="color:#aa5500">// 從Spring IoC容器中獲取對象</span><span style="color:#000000">Girlfriend</span> <span style="color:#000000">girlFriend</span> ?<span style="color:#981a1a">=</span> (<span style="color:#000000">Girlfriend</span>) <span style="color:#000000">ac</span>.<span style="color:#000000">getBean</span>(<span style="color:#aa1111">"gf_Factory_cws"</span>);<span style="color:#000000">girlFriend</span>.<span style="color:#000000">say</span>();<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">girlFriend</span>);} }</span></span>3、通過動(dòng)態(tài)工廠
3.1 動(dòng)態(tài)工廠
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">DynamicGirlFriendFactory</span> {<span style="color:#770088">public</span> <span style="color:#000000">Girlfriend</span> <span style="color:#000000">getGirlFriendFJC</span>(){<span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">GirlfriendFJC</span>();}<span style="color:#770088">public</span> <span style="color:#000000">Girlfriend</span> <span style="color:#000000">getGirlFriendCWS</span>(){<span style="color:#770088">return</span> <span style="color:#770088">new</span> <span style="color:#000000">GirlfriendCWS</span>();} }</span></span>3.2 application_context.xml配置
注意動(dòng)態(tài)工廠內(nèi)部是成員方法,調(diào)用成員方法之前,需要先實(shí)例化工廠,所以,需要配置工廠的bean。然后通過調(diào)用此工廠的方法,實(shí)例化得到對應(yīng)的bean。
<span style="background-color:#f8f8f8"><span style="color:#333333"> ? ?<span style="color:#aa5500"><!--配置動(dòng)態(tài)工廠 --></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"dynamicGirlFriendFactory"</span> <span style="color:#0000cc">class</span>=<span style="color:#aa1111">"com.dyh.factory.DynamicGirlFriendFactory"</span><span style="color:#117700">></</span><span style="color:#117700">bean</span><span style="color:#117700">></span><span style="color:#aa5500"><!--通過此動(dòng)態(tài)工廠得到GirlFrend對象--></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"gf_dynFactory_cws"</span> <span style="color:#0000cc">factory-bean</span>=<span style="color:#aa1111">"dynamicGirlFriendFactory"</span> <span style="color:#0000cc">factory-method</span>=<span style="color:#aa1111">"getGirlFriendCWS"</span><span style="color:#117700">></span><span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span><span style="color:#117700"><</span><span style="color:#117700">bean</span> <span style="color:#0000cc">id</span>=<span style="color:#aa1111">"gf_dynFactory_fjc"</span> <span style="color:#0000cc">factory-bean</span>=<span style="color:#aa1111">"dynamicGirlFriendFactory"</span> <span style="color:#0000cc">factory-method</span>=<span style="color:#aa1111">"getGirlFriendFJC"</span><span style="color:#117700">></span><span style="color:#117700"></</span><span style="color:#117700">bean</span><span style="color:#117700">></span></span></span>3.3 測試TestGirlfriendDynamicFactory
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">TestGirlfriendDynamicFactory</span> {<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {<span style="color:#000000">ApplicationContext</span> <span style="color:#000000">ac</span> <span style="color:#981a1a">=</span><span style="color:#770088">new</span> <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#aa1111">"application_context.xml"</span>);<span style="color:#aa5500">// 從Spring IoC容器中獲取對象</span><span style="color:#000000">Girlfriend</span> <span style="color:#000000">girlFriend</span> <span style="color:#981a1a">=</span> (<span style="color:#000000">Girlfriend</span>) <span style="color:#000000">ac</span>.<span style="color:#000000">getBean</span>(<span style="color:#aa1111">"gf_dynFactory_fjc"</span>);<span style="color:#000000">girlFriend</span>.<span style="color:#000000">say</span>();<span style="color:#000000">System</span>.<span style="color:#000000">out</span>.<span style="color:#000000">println</span>(<span style="color:#000000">girlFriend</span>);} }</span></span>六、在 Spring IOC 容器中獲取 Bean 對象的方式
1、通過 id 或 name 獲取 Bean 對象
Girlfriend girlFriend = (Girlfriend) ac.getBean("gf_dynFactory_fjc");
2、通過類型獲取 Bean 對象
Girlfriend girlFriend = (Girlfriend) ac.getBean(Class clazz);
獲取 Bean 對象
<span style="background-color:#f8f8f8"><span style="color:#333333">public class GirlfriendOYY implements Girlfriend {@Overridepublic void say() {System.out.println("OMG");} }</span></span>配置bean
<span style="background-color:#f8f8f8"><span style="color:#333333"><bean id="gfOYY" class="com.dyh.pojo.impl.GirlfriendOYY"></bean></span></span>測試
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#770088">public</span> <span style="color:#770088">class</span> <span style="color:#0000ff">TestGirlfriendGetByClass</span> {<span style="color:#770088">public</span> <span style="color:#770088">static</span> <span style="color:#008855">void</span> <span style="color:#000000">main</span>(<span style="color:#008855">String</span>[] <span style="color:#000000">args</span>) {<span style="color:#000000">ApplicationContext</span> <span style="color:#000000">ac</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#aa1111">"application_context.xml"</span>);<span style="color:#aa5500">//GirlfriendFJC bean = ac.getBean(GirlfriendFJC.class);</span><span style="color:#000000">GirlfriendOYY</span> <span style="color:#000000">bean</span> <span style="color:#981a1a">=</span> <span style="color:#000000">ac</span>.<span style="color:#000000">getBean</span>(<span style="color:#000000">GirlfriendOYY</span>.<span style="color:#770088">class</span>);<span style="color:#000000">bean</span>.<span style="color:#000000">say</span>();} }</span></span>運(yùn)行結(jié)果
?
特別注意:通過類型去獲取Bean,如果配置文件中配置了多個(gè)此類型的bean,容器不知道你要獲取哪個(gè),所以,還需要指定bean的id或name屬性值。如下操作:
?
原因:
?
總結(jié)
1、理解Spring框架的作用,理解IOC(面試題)。
2、代碼實(shí)現(xiàn):
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#000000">ApplicationContext</span> <span style="color:#000000">ac</span> <span style="color:#981a1a">=</span> <span style="color:#770088">new</span> <span style="color:#000000">ClassPathXmlApplicationContext</span>(<span style="color:#aa1111">"application_context.xml"</span>);</span></span>總結(jié)
以上是生活随笔為你收集整理的Spring简介与IOC容器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BAT的一个定时关机脚本
- 下一篇: 项目管理面试经验之谈