控制反轉
1.概述
Spring有IOC和AOP兩個核心。其中IOC我們說的控制反轉,也就是將創建對象並生命周期的管理過程交給Spring處理。在開發中不再需要關注對象的創建和聲明周期的管理,我們需要式由Spring框架提供,這個由Spring管理創建對象和生命周期的機制稱為控制反轉。創建對象的權力轉給框架,他幫我們創建,我們不再使用new關鍵自來創建對象。
2.原理
創建過程
在初始化一個Spring容器時,Spring會解析spring的配置文件(applicationContext.xml),從上到下解析到<bean id=””,class=””>時,根據標簽中的class屬性指定的類的全路徑名找到該類並通過反射來創建該類的對象,並創建的對象存入到內置的Map容器中管理,其中存入map中的鍵是該標簽中的id值,值是創建的對象。
獲取對象過程
當通過context.getBeans("id值")方法來從容器中獲取對象時,根據id從內置的Map中尋找是否有匹配的鍵值,如果有返回對象,如果沒有拋出異常。
提示:默認情況下,多次獲取同一個id的bean對象得到的是同一個對象(默認情況下創建的對象是單例的,如果需要多例可以該標簽中設置多例)。如果使用一個類配置多個<bean>標簽設置不同的id ,每個id都會在內置Map中有一個鍵值對,其中的值是這個類創建的不同的對象。同一個<beans>標簽下不允許配置多個同id的<標簽>,如果配置會報錯。
3.實現
首先創建lib目錄導入需要依賴的包並buildpath:這些包可以spring官網下載也可以其他遠程倉庫可以下載。
提示:我們這里只是入門使用這種導入方式,后面不需要這樣導入,開發中直接maven來自動導入)
依賴包導入后在指定包中創建一個Person類(為了使用創建對象)
package com.test.spring; public class Person { public void say(String str) { System.out.println(str); } }
然后在src目錄下創建spring的配置文件applicationContext.xml。在這個配置文件中實現IOC控制反轉,也是創建對象負責這個配置文件,我們不需要自己通過new關鍵字來創建對象。
<?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.2.xsd"> <bean id="person" class="com.test.spring.Person"></bean> </beans>
在這里我們在<bean id=””,class=””>里面設置我們需要創建對象的類信息,class里面填寫我們需要創建類的名,spring容器通過這個類名來找到這個類進行加載,然后通過id來給創建的對象設置id,我們使用的時候通過這個id來找到實力化的對象。id可以自定義設置例如:person1,person2,。。都可以,一般使用類名的小寫使用。
注意:<beans >配置內容中不要多余的空格,會報錯的,版本需要一致。按規范來寫。
我們配置文件中配置好以后創建Person_test的測試類進行測試:
package com.test.spring; import org.junit.jupiter.api.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Person_Test { @Test /** * SpringIOC獲取對象 * <bean id="person" class="com.test.spring.person"> */ public void test01() { //創建Spring容器對象 ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); //通過我們配置文件中面配置的beanid來獲取對象:id="person" Person p = (Person)context.getBean("person"); //調用對象的方法,並傳人參數 p.say("Hello SpringIOC"); p.say("Spring控制反轉"); } }
這里的@Test做測試使用的必要需要測試的方法上面插入再通過右鍵—Run as ---JUnit來Junit的方式運行,打印結果如下: