javascript
Spring简介与IOC容器
一、Spring簡介
開源:源碼公開、免費試用;
簡化:簡化企業級開發。
解耦:耦合度降低、可插拔,便于后續維護更新升級拓展。
二、Sping核心模塊
?
Spring 框架的這些模塊可以滿足一切企業級應用開發的需求,在開發過程中可以根據需求有選擇性地使用所需要的模塊。
官網:Spring | Home
Core 核心模塊:提供了 Spring 框架的基本組成部分,包括 IoC 和 DI 功能。
Context 上下文模塊:建立在核心和 Beans 模塊的基礎之上,它是訪問定義和配置任何對象的媒介。ApplicationContext 接口是上下文模塊的焦點。
三、Spring IOC
1、基礎概念
容器:Spring 是一個容器,因為它包含并且管理應用對象的生命周期。
控制反轉:IOC (Inversion of Control),指的是將對象的創建權交給 Spring 去創建。
使用 Spring 之前,對象的創建都是由我們自己在代碼中 new 創建。而使用 Spring之后。對象的創建都是由給了 Spring 框架。
IOC (Inversion of Control) 是指在程序開發中,對象實例的創建不再由調用者管理,而是由 Spring 容器創建。Spring 容器會負責控制程序之間的關系,而不是由程序代碼直接控制,因此,控制權由程序代碼轉移到了 Spring 容器中,控制權發生了反轉,這就是 Spring 的 IOC 思想。
IOC容器的概念:IOC 容器就是具有依賴注入功能的容器,IOC 容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。應用程序無需直接在代碼中 new 相關的對象,應用程序由 IOC 容器進行組裝。在 Spring 中 BeanFactory 是 IOC 容器的實際代表者。
Bean的概念:在 Spring 中,被 Spring 容器所管理的對象稱之為”Bean”對象。一個 Spring 的 Bean 對象可以是任何形式的 POJO。
依賴注入:DI (Dependency Injection),是指依賴的對象不需要手動調用 setXX 方法去設置,而是通過配置賦值。
2、核心API
SpringIOC容器類型:Spring 提供了兩種 IoC 容器,分別為 BeanFactory 和 ApplicationContext。
BeanFactory 是基礎類型的 IoC 容器。它由org.springframework.beans.facytory.BeanFactory 接口定義,并提供了完整的 IoC服務支持。簡單來說, BeanFactory 就是一個管理 Bean 的工廠,它主要負責初始化各種Bean,并調用它們的生命周期方法。
ApplicationContext 是 BeanFactory 的子接口,也被稱為應用上下文。
ClassPathXmlApplicationContext:該 類 從 類 路 徑 ClassPath 中 尋 找 指 定 的 XML 配 置 文 件 , 找 到 并 裝 載 完 成ApplicationContext 的實例化工作。
<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之前的痛點:對象自己創建,每次修改源碼都需要重新編譯,耦合度過高,不便于后續更新升級。
下面以找對象為例。
?
<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>實現類:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 吳俊峰找女朋友的標準</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>實現類2:
<span style="background-color:#f8f8f8"><span style="color:#333333"><span style="color:#aa5500">// 楊涵找女朋友的標準</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">// 任玉濤要換成楊涵的標準,強耦合,每次都需要修改源碼,重新編譯</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、搭建項目
2、通過 IOC 容器管理 Bean 對象
2.1 配置主配置文件application_context.xml
?
配置內容如下:
<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表示單例模式(默認值),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 是一個Spring IoC 容器,需要的時候去容器中獲取,不需要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 容器創建 Bean 對象的三種方式
1、通過構造方法創建Bean
上面案例就是,也就是如下配置,會調用GirlfriendImplYh類默認的無參構造方法實實例化對象得到id為girlFriendYh的一個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、通過靜態工廠
2.1 靜態工廠類
<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配置
靜態工廠內部的方法都為靜態方法,靜態方法可以通過對象名直接方法,故不需要配置工廠相關的bean,只需要配置class和factory-method,也就是告訴Spring容器創建對象的時候使用那個工廠的哪個靜態方法,如下所示:
<span style="background-color:#f8f8f8"><span style="color:#333333"> ? ?<span style="color:#aa5500"><!--表示使用靜態工廠GirlFriendFactory的getGirlFriendFJC方法創建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、通過動態工廠
3.1 動態工廠
<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配置
注意動態工廠內部是成員方法,調用成員方法之前,需要先實例化工廠,所以,需要配置工廠的bean。然后通過調用此工廠的方法,實例化得到對應的bean。
<span style="background-color:#f8f8f8"><span style="color:#333333"> ? ?<span style="color:#aa5500"><!--配置動態工廠 --></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"><!--通過此動態工廠得到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>運行結果
?
特別注意:通過類型去獲取Bean,如果配置文件中配置了多個此類型的bean,容器不知道你要獲取哪個,所以,還需要指定bean的id或name屬性值。如下操作:
?
原因:
?
總結
1、理解Spring框架的作用,理解IOC(面試題)。
2、代碼實現:
<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>總結
以上是生活随笔為你收集整理的Spring简介与IOC容器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BAT的一个定时关机脚本
- 下一篇: JS标签选择器以及节点操作