spring IOC容器管理必須知道這些操作——基於XML方式

Spring——IOC(控制反轉)


一、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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章