1. 程式人生 > 實用技巧 >Spring 5--IOC容器管理(一)

Spring 5--IOC容器管理(一)

一、IOC容器

1、什麼是IOC--控制反轉

  • 把物件建立和物件之間的呼叫過程,交給Spring進行管理
  • 使用IOC目的:為了降低耦合度

2、IOC底層

  • xml解析、工廠模式、反射

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

  • BeanFactory介面:IOC容器基本實現是Spring內部介面的使用介面,不提供給開發人員進行使用(載入配置檔案時候不會建立物件,在獲取物件時才會建立物件。
  • ApplicationContext介面:BeanFactory介面的子介面,提供更多更強大的功能,提供給開發人員使用(載入配置檔案時候就會把在配置檔案物件進行建立)推薦使用。

二、IOC操作Brean管理

1、什麼是Bean管理(Bean管理的兩個操作)

  • Spring建立物件
  • Spring注入屬性

2、Bean管理操作的兩種方式

  • 基於xml配置檔案方式實現
  • 基於註解方式實現

3、基於xml方式

a) 基於xml方式建立物件

 <!--建立物件  id:唯一標識 class:類的全路徑-->
 <bean id="user" class="com.spring.User"></bean>
 //實體類 
public class User {
    public void add(){
        System.out.println("add++++++++++++");
    }
 }
 //通過類載入xml建立物件
 @Test
 public void testAdd(){
    ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//獲取xml檔案,預設獲取無參構造方法建立物件
    User user=context.getBean("user", User.class);
    user.add();
 }

b)基於xml物件注入屬性(DI:依賴注入)

方式一:通過set方式注入

public class User {

    private String name;
    
    
public void setName(String name) { this.name = name; } }

 xml配置:property中 name對於屬性名 value對應屬性值

<!--set注入-->
     <bean id="user" class="com.spring.User">
        <property name="name" value="李四"></property>
     </bean>

方式二:有參構造方式注入

public class User {

    private String name;
    //有參構造方法
    public User(String name) {
        this.name = name;
    }
}
 <!--通過有參構造注入-->
    <bean id="user" class="com.spring.User">
        <constructor-arg name="name" value="王二麻子"></constructor-arg>
    </bean>

方式三:p名稱空間注入(瞭解即可)

<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" <!--在這裡加入一行-->
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!--p空間注入-->
  <bean id="user" name="com.spring.User" p:bname="小名">
  </bean>

注入空值和特殊符號

<!--設定空值-->
  <bean id="course" class="com.spring.bean.Course">
      <property name="cname">
        <null/>
      </property>
  </bean>
  <!--設定特殊符號 
    1、通過轉義
    2、使用<![CDATA[值]]>
  -->
  <bean id="course" class="com.spring.bean.Course">
    <property name="cname">
      <value><![CDATA[<<南京>>]]]></value>
    </property>
  </bean>

注入屬性--外部bean

public class UserService {

    private UserDao userDao;
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void add(){
        System.out.println("service ++++++++++");
        userDao.update();
    }
}

public interface UserDao {
    public abstract void update();
}

public class UserDaoImpl implements UserDao {
    @Override
    public void update() {
        System.out.println("hana");
    }
}
 <!--外部bean注入-->
     <bean id="userService" class="com.spring.service.UserService" >
      <property name="userDao" ref="userDaoImpl"></property>
     </bean>
  
     <bean id="userDaoImpl" class="com.spring.dao.UserDaoImpl" ></bean>

注入屬性--內部bean和級聯賦值

a)內部bean賦值

public class Emp {

    private String Ename;
    private String gender;
    private dept dept;
    public void setEname(String ename) {
        Ename = ename;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public void setDept(dept dept) {
        this.dept = dept;
    }
    public void add(){
        System.out.println("ename="+Ename+"gender="+gender+"dept="+dept);
    }
}

public class dept {

    private String dname;

    public void setDname(String dname) {
        this.dname = dname;
    }
    @Override
    public String toString() {
        return "dept{" +"dname='" + dname + '\'' +'}';
    }
}
  <!--內部bean注入-->
    <bean id="emp" class="com.spring.bean.Emp" >
      <property name="ename" value="小明"></property>
      <property name="gender" value="男"></property>
      <property name="dept">
          <bean id="dept" class="com.spring.bean.dept" >
            <property name="dname" value="技術部"></property>
          </bean>
      </property>
    </bean>

b)級聯賦值

<!--級聯賦值 方式一-->
    <bean id="emp" class="com.spring.bean.Emp">
        <property name="ename" value="小花"></property>
        <property name="gender" value="女"></property>
        <property name="dept" ref="dept"></property>
    </bean>
    <bean id="dept" class="com.spring.bean.dept">
        <property name="dname" value="財務部"></property>
    </bean>
    <!--級聯賦值 方式二(需給dept屬性設定get方法)-->
    <bean id="emp" class="com.spring.bean.Emp" >
        <property name="ename" value="小花"></property>
        <property name="gender" value="女"></property>
        <property name="dept" ref="dept"></property>
        <property name="dept.dname" value="人事部"></property>
    </bean>
    <bean id="dept" class="com.spring.bean.dept"></bean>

xml注入集合屬性

public class Stu {

    private String[] cour;
    private List<String> list;
    private Map<String,String> map;
    private Set<String> set;
    private List<Course> listcour;
    //設定陣列屬性
    public void setCour(String[] cour) {
        this.cour = cour;
    }
    //設定list集合屬性
    public void setList(List<String> list) {
        this.list = list;
    }
   //設定map集合屬性
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
  //設定set集合屬性
    public void setSet(Set<String> set) {
        this.set = set;
    }
    //設定list實體類屬性
    public void setListcour(List<Course> listcour) {
        this.listcour = listcour;
    }

    public void add() {
        System.out.println("Stu{" +
                "cour=" + Arrays.toString(cour) +
                ", list=" + list +
                ", map=" + map +
                ", set=" + set +
                ", listcour=" + listcour +
                '}');
    }
}
<!--集合屬性注入-->
    <bean id="stu" class="com.spring.bean.Stu">
        <!--陣列注入-->
        <property name="cour" >
            <array>
            <value>java</value>
            <value>資料庫</value>
            </array>
        </property>
        <!--list注入-->
        <property name="list">
            <list>
                <value>張三</value>
                <value>小三</value>
            </list>
        </property>
        <!--map注入-->
        <property name="map">
            <map>
                <entry key="神仙" value="天上"></entry>
                <entry key="閻王" value="地下"></entry>
            </map>
        </property>
        <!--set注入-->
        <property name="set">
            <set>
                <value>ORACLE</value>
                <value>MYSQL</value>
            </set>
        </property>
        <!--list實體類注入-->
        <property name="listcour">
            <list>
                <ref bean="cusor1"></ref>
                <ref bean="cusor2"></ref>
            </list>
        </property>
    </bean>
    <bean id="cusor1" class="com.spring.bean.Course">
        <property name="cname" value="Spring5"></property>
    </bean>
    <bean id="cusor2" class="com.spring.bean.Course">
        <property name="cname" value="Spring6"></property>
    </bean>

把集合注入部分提取出來

public class Book {

    private List<String> list;

    public void setList(List<String> list) {
        this.list = list;
    }

    public void add(){
        System.out.println(list);
    }
}

1、在spring配置檔案中引入空間名稱util

<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"
       xmlns:util="http://www.springframework.org/schema/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:list id="listbook">
        <value>小花</value>
        <value>小明</value>
        <value>小紅</value>
    </util:list>
    <bean id="book" class="com.spring.bean.Book">
        <property name="list" ref="listbook"/>
    </bean>
</beans>