Java框架學習——Spring(二):IOC容器
阿新 • • 發佈:2021-07-17
IOC底層原理
什麼是IOC
(1)控制反轉,把物件建立和物件之間的呼叫過程,交給Spring進行管理
(2)使用IOC的目的:為了耦合度降低
(3)入門案例就是IOC實現
耦合性(英語:Coupling,dependency,)是一種軟體度量,是指一程式中,模組及模組之間資訊或引數依賴的程度。 內聚性是一個和耦合性相對的概念,一般而言低耦合性代表高內聚性,反之亦然。耦合性和內聚性都是由提出結構化設計概念的賴瑞·康斯坦丁所提出。 低耦合性是結構良好程式的特性,低耦合性程式的可讀性及可維護性會比較好。IOC底層原理
(1) xml解析、工廠模式、反射
(2)工廠模式比傳統例項化物件的區別,可以大大降低程式碼之間的耦合度
IOC的過程
IOC介面(BeanFactory)
1. IOC思想基於IOC容器完成,IOC容器底層就是物件工廠
2. Spring提供IOC容器兩種實現方式(兩個介面):
(1) BeanFactory:IOC容器基本實現,是Spring內部的使用介面,不提供開發人員進行使用
- 載入配置檔案時不會建立物件,在獲取(使用)物件時才會建立(懶漢式)
(2) ApplicationContext:BeanFactory介面的子介面,提供更多更強大的功能,一般由開發人員進行使用
- 載入配置檔案時就會將配置檔案物件進行建立(餓漢式)
3.ApplictionContext實現類
Bean管理
什麼是Bean管理?
(0)Bean管理指的是兩個操作
(1)Spring建立物件
(2)Spring注入屬性
IOC操作:Bean管理(基於XML)
1. 基於xml方式建立物件
(1)在spirng配置檔案中,使用bean標籤,標籤裡面新增對應屬性,就可以實現物件建立
(2)在bean標籤有很多屬性,介紹常用屬性
- id屬性:唯一標識
- class屬性:類全路徑(包類路徑)
(3)建立物件時候,預設也是執行無引數構造方法完成物件建立
2. 基於xml方式注入屬性
(1)DI:依賴注入,就是注入屬性
- set方法注入
1 //(1)傳統方式: 建立類,定義屬性和對應的set方法 2public class Book { 3 //建立屬性 4 private String bname; 5 6 //建立屬性對應的set方法 7 public void setBname(String bname) { 8 this.bname = bname; 9 } 10 }
1 <!--(2)spring方式: set方法注入屬性--> 2 <bean id="book" class="com.atguigu.spring5.Book"> 3 <!--使用property完成屬性注入 4 name:類裡面屬性名稱 5 value:向屬性注入的值 6 --> 7 <property name="bname" value="Hello"></property> 8 <property name="bauthor" value="World"></property> 9 </bean>
- 含參構造方法注入
1 //(1)傳統方式:建立類,構建有參函式 2 public class Orders { 3 //屬性 4 private String oname; 5 private String address; 6 //有引數構造 7 public Orders(String oname,String address) { 8 this.oname = oname; 9 this.address = address; 10 } 11 }
1 <!--(2)spring方式:有引數構造注入屬性--> 2 <bean id="orders" class="com.atguigu.spring5.Orders"> 3 <constructor-arg name="oname" value="Hello"></constructor-arg> 4 <constructor-arg name="address" value="China!"></constructor-arg> 5 </bean>
- p名稱空間注入(瞭解)
1 <!--1、新增p名稱空間在配置檔案頭部--> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xmlns:p="http://www.springframework.org/schema/p" <!--在這裡新增一行p--> 6 7 <!--2、在bean標籤進行屬性注入(算是set方式注入的簡化操作)--> 8 <bean id="book" class="com.atguigu.spring5.Book" p:bname="very" p:bauthor="good"> 9 </bean>
2. xml注入其他型別屬性
1 <bean id="book" class="com.atguigu.spring5.Book"> 2 <!--(1)null值--> 3 <property name="address"> 4 <null/><!--屬性裡邊新增一個null標籤--> 5 </property> 6 7 <!--(2)特殊符號賦值--> 8 <!--屬性值包含特殊符號 9 a 把<>進行轉義 < > 10 b 把帶特殊符號內容寫到CDATA 11 --> 12 <property name="address"> 13 <value><![CDATA[<<南京>>]]></value> 14 </property> 15 </bean>
3. 注入屬性-外部bean
(1)建立兩個類 service 類和 dao 類1 public class UserService {//service類 2 3 //建立UserDao型別屬性,生成set方法 4 private UserDao userDao; 5 public void setUserDao(UserDao userDao) { 6 this.userDao = userDao; 7 } 8 9 public void add() { 10 System.out.println("service add..............."); 11 userDao.update();//呼叫dao方法 12 } 13 } 14 15 public class UserDaoImpl implements UserDao {//dao類 16 17 @Override 18 public void update() { 19 System.out.println("dao update..........."); 20 } 21 }(2)在 service 呼叫 dao 裡面的方法,在 spring 配置檔案中進行配置
1 <!--1 service和dao物件建立--> 2 <bean id="userService" class="com.atguigu.spring5.service.UserService"> 3 <!--注入userDao物件 4 name屬性:類裡面屬性名稱 5 ref屬性:建立userDao物件bean標籤id值 6 --> 7 <property name="userDao" ref="userDaoImpl"></property> 8 </bean> 9 <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>
4.基於XML方式注入內部bean和級聯賦值
a) 注入屬性-內部bean
(1)一對多關係:部門和員工
一個部門有多個員工,一個員工屬於一個部門(部門是一,員工是多)
(2)在實體類之間表示一對多關係,員工表示所屬部門,使用物件型別屬性進行表示
1 //部門類 2 public class Dept { 3 private String dname; 4 public void setDname(String dname) { 5 this.dname = dname; 6 } 7 } 8 9 //員工類 10 public class Emp { 11 private String ename; 12 private String gender; 13 //員工屬於某一個部門,使用物件形式表示 14 private Dept dept; 15 16 public void setDept(Dept dept) { 17 this.dept = dept; 18 } 19 public void setEname(String ename) { 20 this.ename = ename; 21 } 22 public void setGender(String gender) { 23 this.gender = gender; 24 } 25 }
(3)在spring配置檔案中配置
1 <!--內部bean--> 2 <bean id="emp" class="com.atguigu.spring5.bean.Emp"> 3 <!--設定兩個普通屬性--> 4 <property name="ename" value="Andy"></property> 5 <property name="gender" value="女"></property> 6 <!--設定物件型別屬性--> 7 <property name="dept"> 8 <bean id="dept" class="com.atguigu.spring5.bean.Dept"><!--內部bean賦值--> 9 <property name="dname" value="宣傳部門"></property> 10 </bean> 11 </property> 12 </bean>
b)注入屬性-級聯賦值
1 <!--方式一:級聯賦值--> 2 <bean id="emp" class="com.atguigu.spring5.bean.Emp"> 3 <!--設定兩個普通屬性--> 4 <property name="ename" value="Andy"></property> 5 <property name="gender" value="女"></property> 6 <!--級聯賦值--> 7 <property name="dept" ref="dept"></property> 8 </bean> 9 <bean id="dept" class="com.atguigu.spring5.bean.Dept"> 10 <property name="dname" value="公關部門"></property> 11 </bean>
1 //方式二:生成dept的get方法(get方法必須有!!) 2 public Dept getDept() { 3 return dept; 4 }
1 <!--級聯賦值--> 2 <bean id="emp" class="com.atguigu.spring5.bean.Emp"> 3 <!--設定兩個普通屬性--> 4 <property name="ename" value="jams"></property> 5 <property name="gender" value="男"></property> 6 <!--級聯賦值--> 7 <property name="dept" ref="dept"></property> 8 <property name="dept.dname" value="技術部門"></property> 9 </bean> 10 <bean id="dept" class="com.atguigu.spring5.bean.Dept"> 11 </bean>
IOC操作:Bean管理(基於註解)
1、注入陣列型別屬性 2、注入 List 集合型別屬性 3、注入 Map 集合型別屬性
1 //(1)建立類,定義陣列、list、map、set 型別屬性,生成對應 set 方法 2 public class Stu { 3 //1 陣列型別屬性 4 private String[] courses; 5 //2 list集合型別屬性 6 private List<String> list; 7 //3 map集合型別屬性 8 private Map<String,String> maps; 9 //4 set集合型別屬性 10 private Set<String> sets; 11 12 public void setSets(Set<String> sets) { 13 this.sets = sets; 14 } 15 public void setCourses(String[] courses) { 16 this.courses = courses; 17 } 18 public void setList(List<String> list) { 19 this.list = list; 20 } 21 public void setMaps(Map<String, String> maps) { 22 this.maps = maps; 23 }
1 <!--(2)在 spring 配置檔案進行配置--> 2 <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu"> 3 <!--陣列型別屬性注入--> 4 <property name="courses"> 5 <array> 6 <value>java課程</value> 7 <value>資料庫課程</value> 8 </array> 9 </property> 10 <!--list型別屬性注入--> 11 <property name="list"> 12 <list> 13 <value>張三</value> 14 <value>小三</value> 15 </list> 16 </property> 17 <!--map型別屬性注入--> 18 <property name="maps"> 19 <map> 20 <entry key="JAVA" value="java"></entry> 21 <entry key="PHP" value="php"></entry> 22 </map> 23 </property> 24 <!--set型別屬性注入--> 25 <property name="sets"> 26 <set> 27 <value>MySQL</value> 28 <value>Redis</value> 29 </set> 30 </property> 31 </bean>
在集合裡面設定物件型別值
//學生所學多門課程 private List<Course> courseList;//建立集合 public void setCourseList(List<Course> courseList) { this.courseList = courseList; }
<!--建立多個course物件--> <bean id="course1" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="Spring5框架"></property> </bean> <bean id="course2" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="MyBatis框架"></property> </bean> <!--注入list集合型別,值是物件--> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list> </property>
<!--第一步:在 spring 配置檔案中引入名稱空間 util--> <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" <!--新增util名稱空間--> xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!--新增util名稱空間--> <!--第二步:使用 util 標籤完成 list 集合注入提取--> <!--把集合注入部分提取出來--> <!--1 提取list集合型別屬性注入--> <util:list id="bookList"> <value>易筋經</value> <value>九陰真經</value> <value>九陽神功</value> </util:list> <!--2 提取list集合型別屬性注入使用--> <bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"> <property name="list" ref="bookList"></property> </bean>