首頁 > 軟體

spring IOC容器管理必須知道的一些操作(基於XML方式)

2022-03-02 13:01:34

一、IOC容器

​ 1、什麼是IOC(控制反轉)

​ a)把物件建立和物件之間的呼叫過程,交給Spring進行管理

​ b)使用IOC目的:為了降低耦合度

​ 2、IOC底層

​ a)xml解析、工廠模式、反射

​ 3、Spring提供的IOC容器實現的兩種方式(兩個介面)

​ a)BeanFactory介面:IOC容器基本實現是Spring內部介面的使用介面,不提供給開發人員進行使用(載入組態檔時候不會建立物件,在獲取物件時才會建立物件。)

​ b)ApplicationContext介面:BeanFactory介面的子介面,提供更多更強大的功能,提供給開發人員使用(載入組態檔時候就會把在組態檔物件進行建立)推薦使用!

​ 4、ApplicationContext介面的實現類(具體根據API檔案檢視☺)

二、IOC容器-Bean管理

​ 1、IOC操作Bean管理

​ a)Bean管理就是兩個操作:(1)Spring建立物件;(2)Spring注入屬性

​ 2、基於XML組態檔建立物件

<!--1 設定User物件建立-->
<bean id="user" class="com.atguigu.spring5.User"></bean>

​ 3、基於XML方式注入屬性(DI:依賴注入(注入屬性))

​ a)set方式注入

//(1)傳統方式: 建立類,定義屬性和對應的set方法
public class Book {
        //建立屬性
        private String bname;

        //建立屬性對應的set方法
        public void setBname(String bname) {
            this.bname = bname;
        }
   }
<!--(2)spring方式: set方法注入屬性-->
<bean id="book" class="com.atguigu.spring5.Book">
    <!--使用property完成屬性注入
        name:類裡面屬性名稱
        value:向屬性注入的值
    -->
    <property name="bname" value="Hello"></property>
    <property name="bauthor" value="World"></property>
</bean>

​ b)有參建構函式注入

//(1)傳統方式:建立類,構建有參函數
public class Orders {
    //屬性
    private String oname;
    private String address;
    //有引數構造
    public Orders(String oname,String address) {
        this.oname = oname;
        this.address = address;
    }
  }
<!--(2)spring方式:有引數構造注入屬性-->
<bean id="orders" class="com.atguigu.spring5.Orders">
    <constructor-arg name="oname" value="Hello"></constructor-arg>
    <constructor-arg name="address" value="China!"></constructor-arg>
</bean>

​ c)p名稱空間注入(瞭解即可)

<!--1、新增p名稱空間在組態檔頭部-->
<?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:p="http://www.springframework.org/schema/p"		<!--在這裡新增一行p-->

<!--2、在bean標籤進行屬性注入(算是set方式注入的簡化操作)-->
    <bean id="book" class="com.atguigu.spring5.Book" p:bname="very" p:bauthor="good">
    </bean>

​ 4、注入空值和特殊符號

<bean id="book" class="com.atguigu.spring5.Book">
    <!--(1)null值-->
    <property name="address">
        <null/><!--屬性裡邊新增一個null標籤-->
    </property>
    
    <!--(2)特殊符號賦值-->
     <!--屬性值包含特殊符號
       a 把<>進行跳脫 &lt; &gt;
       b 把帶特殊符號內容寫到CDATA
      -->
        <property name="address">
            <value><![CDATA[<<南京>>]]></value>
        </property>
</bean>

​ 5、注入屬性-外部bean

​ a)建立兩個類service和dao類

public class UserService {//service類

    //建立UserDao型別屬性,生成set方法
    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add() {
        System.out.println("service add...............");
        userDao.update();//呼叫dao方法
    }
}

public class UserDaoImpl implements UserDao {//dao類

    @Override
    public void update() {
        System.out.println("dao update...........");
    }
}

​ b)在spring組態檔中進行設定

<!--1 service和dao物件建立-->
<bean id="userService" class="com.atguigu.spring5.service.UserService">
    <!--注入userDao物件
        name屬性:類裡面屬性名稱
        ref屬性:建立userDao物件bean標籤id值
    -->
    <property name="userDao" ref="userDaoImpl"></property>
</bean>
<bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean>

​ 6、基於XML方式注入內部bean和級聯賦值

​ a)注入屬性-內部bean

(1)一對多關係:部門和員工
一個部門有多個員工,一個員工屬於一個部門(部門是一,員工是多)
(2)在實體類之間表示一對多關係,員工表示所屬部門,使用物件型別屬性進行表示

//部門類
public class Dept {
    private String dname;
    public void setDname(String dname) {
        this.dname = dname;
    }
}

//員工類
public class Emp {
    private String ename;
    private String gender;
    //員工屬於某一個部門,使用物件形式表示
    private Dept dept;
    
    public void setDept(Dept dept) {
        this.dept = dept;
    }
    public void setEname(String ename) {
        this.ename = ename;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
}

(3)在spring組態檔中設定

<!--內部bean-->
    <bean id="emp" class="com.atguigu.spring5.bean.Emp">
        <!--設定兩個普通屬性-->
        <property name="ename" value="Andy"></property>
        <property name="gender" value="女"></property>
        <!--設定物件型別屬性-->
        <property name="dept">
            <bean id="dept" class="com.atguigu.spring5.bean.Dept"><!--內部bean賦值-->
                <property name="dname" value="宣傳部門"></property>
            </bean>
        </property>
    </bean>

​ b)注入屬性-級聯賦值

<!--方式一:級聯賦值-->
    <bean id="emp" class="com.atguigu.spring5.bean.Emp">
        <!--設定兩個普通屬性-->
        <property name="ename" value="Andy"></property>
        <property name="gender" value="女"></property>
        <!--級聯賦值-->
        <property name="dept" ref="dept"></property>
    </bean>
    <bean id="dept" class="com.atguigu.spring5.bean.Dept">
        <property name="dname" value="公關部門"></property>
    </bean>
 //方式二:生成dept的get方法(get方法必須有!!)
    public Dept getDept() {
        return dept;
    }
 <!--級聯賦值-->
    <bean id="emp" class="com.atguigu.spring5.bean.Emp">
        <!--設定兩個普通屬性-->
        <property name="ename" value="jams"></property>
        <property name="gender" value="男"></property>
        <!--級聯賦值-->
        <property name="dept" ref="dept"></property>
        <property name="dept.dname" value="技術部門"></property>
    </bean>
    <bean id="dept" class="com.atguigu.spring5.bean.Dept">
    </bean>

​ 7、IOC 操作 Bean 管理——xml 注入集合屬性

1、注入陣列型別屬性 2、注入 List 集合型別屬性 3、注入 Map 集合型別屬性

//(1)建立類,定義陣列、list、map、set 型別屬性,生成對應 set 方法
public class Stu {
    //1 陣列型別屬性
    private String[] courses;
    //2 list集合型別屬性
    private List<String> list;
    //3 map集合型別屬性
    private Map<String,String> maps;
    //4 set集合型別屬性
    private Set<String> sets;
    
    public void setSets(Set<String> sets) {
        this.sets = sets;
    }
    public void setCourses(String[] courses) {
        this.courses = courses;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }
<!--(2)在 spring 組態檔進行設定-->
    <bean id="stu" class="com.atguigu.spring5.collectiontype.Stu">
        <!--陣列型別屬性注入-->
        <property name="courses">
            <array>
                <value>java課程</value>
                <value>資料庫課程</value>
            </array>
        </property>
        <!--list型別屬性注入-->
        <property name="list">
            <list>
                <value>張三</value>
                <value>小三</value>
            </list>
        </property>
        <!--map型別屬性注入-->
        <property name="maps">
            <map>
                <entry key="JAVA" value="java"></entry>
                <entry key="PHP" value="php"></entry>
            </map>
        </property>
        <!--set型別屬性注入-->
        <property name="sets">
            <set>
                <value>MySQL</value>
                <value>Redis</value>
            </set>
        </property>
</bean>

​ 8、在集合裡面設定物件型別值

  //學生所學多門課程
    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>

總結

到此這篇關於spring IOC容器管理必須知道的一些操作的文章就介紹到這了,更多相關spring IOC容器管理操作內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com