-
什麼是IOC?
- 控制反轉,把物件建立和物件之間的呼叫過程交給spring進行管理,為了降低耦合度
-
兩種IOC介面
- BeanFactory:IOC 容器基本實現,是 Spring 內部的使用介面,不提供開發人員進行使用載入配置檔案時候不會建立物件,在獲取物件(使用)才去建立物件
- ApplicationContext:BeanFactory 介面的子介面,提供更多更強大的功能,一般由開發人員進行使用,載入配置檔案時候就會把在配置檔案物件進行建立。常用。
-
建立ApplicationContext介面例項通常採用ClassPathXmlApplicationContext建立
//初始化Spring容器,載入配置檔案 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("bean.xml"); //2、透過容器獲取userDao例項 UserDao userDao = (UserDao) applicationContext.getBean("userDao");
-
spring配置檔案的編寫
// Spring檔案建立Bean <?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.xsd"> <!--讓指定類配置給Spring,讓Spring建立其物件的例項--> <bean id = "userDao" class="com.test.springTest.UserDaoImpl"/> </beans>
-
依賴注入
- DI(依賴注入)與控制反轉(IOC)的具體實現,實現IOC思想需要DI做支援,就是在spring這個容器中,你需要將一些類交給spring容器進行管理,然後在你需要的時候,不是自己去定義,而是直接向spring容器索取,當spring容器知道你的需求之後,就會去它所管理的元件中進行查詢,然後直接給你所需要的元件。依賴:bean對像的建立依賴與容器,注入:bean物件的所有屬性,由容器來注入。
-
依賴注入的兩種方式:set注入,構造方法注入
參考:https://blog.csdn.net/cold___play/article/details/100059134
-
建構函式注入
- user的有參構造
package com.test.bean; public class User { private String name; private Integer age; private Car car; public User(String name, Car car) { System.out.println("User(String name, Car car)!!"); this.name = name; this.car = car; } public User(Car car,String name) { System.out.println("User(Car car,String name)!!"); this.name = name; this.car = car; } public User(Integer name, Car car) { System.out.println("User(Integer name, Car car)!!"); this.name = name+""; this.car = car; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } @Override public String toString() { return "User [name=" + name + ", age=" + age + ", car=" + car + "]"; } }
- applicationContext.xml配置:index:用於確定引數的位置,type:用於確定引數的型別,這兩個屬性可以完全確定一個建構函式。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 將car物件配置到容器中 --> <bean name="car" class="com.test.bean.Car" > <property name="name" value="保時捷" ></property> <property name="color" value="紅色" ></property> </bean> <!-- 建構函式注入 --> <bean name="user2" class="com.test.bean.User" > <!-- name屬性: 建構函式的引數名 index屬性: 建構函式的引數索引 type屬性: 建構函式的引數型別 --> <constructor-arg name="name" value="24" index="0" type="java.lang.Integer"></constructor-arg> <constructor-arg name="car" ref="car" index="1" ></constructor-arg> </bean> </beans>
-
set方法注入
-
每一個實體類為其屬性寫上相應的set,get方法
-
applicationContext.xml中進行配置:
-
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- set方式注入: --> <bean name="user" class="com.test.bean.User" > <!--值型別注入: 為User物件中名為name的屬性注入tom作為值 --> <property name="name" value="tom" ></property> <property name="age" value="18" ></property> <!-- 引用型別注入: 為car屬性注入下方配置的car物件 --> <property name="car" ref="car" ></property> </bean> <!-- 將car物件配置到容器中 --> <bean name="car" class="pers.zhang.bean.Car" > <property name="name" value="保時捷" ></property> <property name="color" value="紅色" ></property> </bean> </beans>
-
複雜型別的注入
- 建立一個CollectionBean類:
package com.test.bean; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Properties; public class CollectionBean { private Object[] arr;//陣列型別注入 private List list;//list/set 型別注入 private Map map;//map型別注入 private Properties prop;//properties型別注入 public Object[] getArr() { return arr; } public void setArr(Object[] arr) { this.arr = arr; } public List getList() { return list; } public void setList(List list) { this.list = list; } public Map getMap() { return map; } public void setMap(Map map) { this.map = map; } public Properties getProp() { return prop; } public void setProp(Properties prop) { this.prop = prop; } @Override public String toString() { return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop + "]"; } }
- applicationContext.xml中進行配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- set方式注入: --> <bean name="user" class="com.test.bean.User" > <!--值型別注入: 為User物件中名為name的屬性注入tom作為值 --> <property name="name" value="tom" ></property> <property name="age" value="18" ></property> <!-- 引用型別注入: 為car屬性注入下方配置的car物件 --> <property name="car" ref="car" ></property> </bean> <bean name="car" class="pers.zhang.bean.Car" > <property name="name" value="保時捷" ></property> <property name="color" value="紅色" ></property> </bean> <!-- 複雜型別注入 --> <bean name="cb" class="com.test.CollectionBean" > <!-- 陣列型別注入 --> <property name="arr"> <!-- 元素順序與注入順序一致 --> <array> <value>tom</value> <value>jerry</value> <ref bean="user" /> </array> </property> </bean> <bean name="cb" class="com.test.CollectionBean" > <!-- list型別注入 --> <property name="list" > <list> <value>jack</value> <value>rose</value> <ref bean="user" /> </list> </property> </bean> <bean name="cb" class="com.test.CollectionBean" > <!-- map型別注入 --> <property name="map" > <map> <!-- 鍵為字串,值為字串 --> <entry key="url" value="jdbc:mysql ></entry> <!-- 鍵為字串,值為物件 --> <entry key="user" value-ref="user" ></entry> <!-- 鍵為物件,值為物件 --> <entry key-ref="user2" value-ref="user2" ></entry> </map> </property> </bean> <bean name="cb" class="com.test.CollectionBean" > <!-- prperties 型別注入 --> <property name="prop" > <props> <prop key="driverClass">com.jdbc.mysql.Driver</prop> <prop key="userName">root</prop> <prop key="password">1234</prop> </props> </property> </bean> </beans>
-
擴充套件注入方式
- p名稱空間注入:走set方法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 將car物件配置到容器中 --> <bean name="car" class="com.test.bean.Car" > <property name="name" value="保時捷" ></property> <property name="color" value="紅色" ></property> </bean> <!-- p名稱空間注入, 走set方法 1.匯入P名稱空間 xmlns:p="http://www.springframework.org/schema/p" 2.使用p:屬性完成注入 |-值型別: p:屬性名="值" |-物件型別: p:屬性名-ref="bean名稱" --> <bean name="user" class="com.test.bean.User" p:name="Jack" p:age="20" p:car-ref="car" ></bean> </beans>
-
c名稱空間注入:走構造器方法
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd "> <!-- 將car物件配置到容器中 --> <bean name="car" class="com.test.bean.Car" > <property name="name" value="保時捷" ></property> <property name="color" value="紅色" ></property> </bean> <!-- c名稱空間注入, 走構造方法,要給定有參和無參的構造方法 匯入c名稱空間 xmlns:c="http://www.springframework.org/schema/c" --> <bean name="user" class="com.test.bean.User" c:name="Jack" c:age="20" ></bean> </beans>
-