1. 程式人生 > 其它 >Java框架學習——Spring(二):IOC容器

Java框架學習——Spring(二):IOC容器

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方法
 2
public 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 把<>進行轉義 &lt; &gt;
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>