Spring筆記(一)

一、Ioc容器(概念)

  1. 什麼是IoC?
    • 控制反轉,把對象創建和對象之間得調用過程,交給了Spring來管理
    • 使用IoC得目的:為了降低耦合度
  2. IoC底層使用了哪些技術?
    • XML解析
    • 工廠模式
    • 反射
  3. Spring提供的IoC容器實現的兩種方式(兩個介面):
    • BeanFactory介面:IoC容器基本實現,是Spring內部的使用介面,不提供開發人員進行使用(載入配置文件的時候不會創建對象,只有在獲取對象的時候才回去創建對象,懶載入)
    • ApplicationContext介面:BeanFactory介面的子介面,提供了更多更強大的功能,一般由開發人員進行使用(載入配置文件的時候就會把在配置文件對象進行創建)
  4. ApplicationContext介面的實現類
    • FileSystemXmlApplicationContext:載入xml配置文件的時候使用的是絕對路徑
    • ClassPathXmlApplicationContext:載入xml配置文件的時候使用的是相對路徑,src目錄下為根目錄

二、 IoC容器 – Bean管理(基於XML方式)

  1. Bean管理由兩個操作:

    • Spring創建對象
    • Spring注入屬性
  2. 基於XML方式創建對象

    • <bean id="該Bean對象的id名稱,唯一標識" class="Bean對象的全類名"></bean>
      

      創建對象的時候,默認執行無參數構造的方法完成對象的創建

  3. 基於XML方式注入屬性(DI:依賴注入(DI是IoC中的一種具體實現)

    1. 使用set方法進行注入

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

      public class Orders {
          //屬性
          private String oname;
          private String address;
          //有參數構造
          public Orders(String oname,String address) {
              this.oname = oname;
              this.address = address;
          }
      }
      
      <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>
      
    3. p名稱空間注入(了解即可)

      <!--1、添加p名稱空間在配置文件頭部-->
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="//www.springframework.org/schema/beans"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xmlns:p="//www.springframework.org/schema/p"		<!--在這裡添加一行p-->
      
      	<!--2、在bean標籤進行屬性注入(算是set方式注入的簡化操作)-->
          <bean id="book" class="com.atguigu.spring5.Book" p:bname="hello" p:bauthor="world"></bean>
      </beans>
      
    4. XML注入其他類型的屬性(字面量:null值、包含的特殊符號)

      • 注入null值

        <property name="address">
            <null/>
        </property>
        
      • 注入特殊符號

        <!-- 有兩種方法:
        			將符號轉義:&lt;替換<,
        			使用CDATA
        -->
        <property name = "address">
            <value><![CDATA[<<南京>>]]></value>
        </property>
        
        
        
    5. 注入屬性:外部Bean

      • 創建兩個類Service類和dao類
      • 在service調用dao裡面的方法
      • 在Spring配置文件中進行配置
      //service類
      public class UserService {
      
          //創建UserDao類型屬性,生成set方法
          private UserDao userDao;
          public void setUserDao(UserDao userDao) {
              this.userDao = userDao;
          }
      
          public void add() {
              System.out.println("service add...............");
              //調用dao方法
              userDao.update();
          }
      }
      
      //dao類
      public class UserDaoImpl implements UserDao {
      
          @Override
          public void update() {
              System.out.println("dao update...........");
          }
      }
      
      
      • 在Spring配置文件中進行配置
      <bean id="userService" class="com.atguigu.spring5.UserService">
          <!-- 
      		注入dao對象、
      		name屬性:類裡面的id名稱
      		ref屬性:創建userDao對象bean標籤id值
      	-->
          <property name="userDao" ref="userDaoImpl"></property>
      </bean>
      <bean id="userDaoImpl" class="com.atguigu.spring5.UserDaoImpl"></bean>
      
    6. 注入屬性:內部Bean

      • 一對多關係:部門和員工,一個部門有多個員工,一個員工屬於一個部門
      • 在實體類之間表示一對多關係,員工表示所屬部門,在使用對象類型屬性進行表示
      //部門類
      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;
          }
      }
      
      • 在Spring配置文件中配置
      <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" name="com.atguigu.spring5.bean.Dept">
                  <property name="dname" value="安保部"></property>
              </bean>
          </property>
      </bean>
      
    7. 注入屬性:級聯賦值

      • 方法一:級聯賦值

        <!--方式一:級聯賦值-->
        <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方法)
         <!-- 級聯賦值 -->
        <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>
        
    8. XML注入集合屬性

      • 注入數組類型屬性
      • 注入List集合類型屬性
      • 注入Map集合類型屬性
      • 注入Set集合類型屬性
      //(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>
      
    9. 在集合裡面設置對象類型的值

      • 如果集合里的元素類型是對象,則不能用普通的方法來注入
      // 創建課程類,學生所學多門課程
      public class Course {
          private String cname;
      
          public void setCname(String cname) {
              this.cname = cname;
          }
      
          @Override
          public String toString() {
              return "Course{" +
                      "cname='" + cname + '\'' +
                      '}';
          }
      }
      
      • 然後編輯XML配置文件
      <!-- 先創建多個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>
      
      <!-- 然後在property中注入 -->
      <bean>
          <property name="courseList">
              <list>
                  <ref bean="course1"></ref>
                  <ref bean="course2"></ref>
              </list>
          </property>
      </bean>
      
    10. 將集合注入的部分提取出來

      • 先在spring配置文件中映入名稱空間util
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="//www.springframework.org/schema/beans"
             xmlns:xsi="//www.w3.org/2001/XMLSchema-instance"
             xmlns:util="//www.springframework.org/schema/util"
             xsi:schemaLocation="//www.springframework.org/schema/beans //www.springframework.org/schema/beans/spring-beans.xsd
                                 //www.springframework.org/schema/util //www.springframework.org/schema/util/spring-util.xsd">
      </beans>
      
      • 使用util標籤完成List集合注入提取
      <util:list id="bookList">
          <value>易筋經</value>
          <value>九陰真經</value>
          <value>葵花寶典</value>
      </util:list>
      
      • 將提取出來的集合類型屬性注入使用
      <bean id="book" class="com.atguigu.spring5.collectiontype.Book">
          <property name="list" ref="bookList"></property>
      </bean>
      
Tags: