Spring學習日記01_IOC_xml的三種注入方式

Ueao發表於2021-06-30

什麼是IOC

  • 控制反轉,把物件建立和物件之間的呼叫過程,交給Spring進行管理
  • 使用IOC目的:為了耦合度降低
  • 做入門案例就是IOC實現

IOC底層原理

  • xml解析 工廠模式 反射

原始方式

class UserService{
  execute(){
    UserDao dao = new UserDao();
    dao.add();
  }
}

class UserDao{
  add(){
    ...
  }
}
  • 缺點:耦合度太高

工廠模式

class UserService{
  execute(){
    UserDao dao = UserFactory.getDao();
    dao.add();
  }
}

class UserDao(){
  add(){
    ...
  }
}

class UserFactory{
  public static UserDao getDao(){
    return new UserDao();
  }
}
  • 目的:耦合度還可降低

IOC解耦過程

  1. xml配置檔案,配置建立的物件
    <bean id = "own" class = "com.own.UserDao"></bean>

  2. 有service類和dao類,建立工廠類

class UserFactory{
  public static UserDao getDao(){
    String classValue = class屬性值; // 1.xml解析
    Class clazz = Class.forName(classValue); // 2.通過反射建立物件
    retuen (UserDao) clazz.newInstance();
  }
}
  • 進一步降低耦合度

IOC(介面)

  1. IOC思想基於IOC容器完成,IOC容器底層就是物件工廠

  2. Spring提供IOC容器實現兩種方式:(兩個介面)

  • BeanFactory:IOC容器基本實現,是SPring內部的使用介面,比提供開發人員進行使用
    • 載入配置檔案的時候不會建立物件,在獲取(使用)物件時才去建立物件
  • ApplicationContext:BeanFactory介面的子介面,提供更多更強大的功能,一般由開發人員進行使用
    • 載入配置檔案時就建立物件
  1. ApplicationContext介面實現類(主要兩個)
  • FileSystemXmlApplicationContext (磁碟路徑)

  • ClassPathXmlApplicationContext (相對路徑)

//xml配置檔案
<bean id = "user" class = "com.own.User"></bean>

//Java類
public void test(){

   //1. 載入spring配置檔案
  ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

   //2. 獲取配置建立的物件
  User user = context.getBean("user",User.class);

}

IOC操作Bean管理(概念)

  1. 什麼是Bean管理?
  • Bean管理指的是兩個操作
    • Spring建立物件
    • Spring注入屬性
  1. Bean管理操作有兩種方式
  • 基於xml配置檔案方式實現
  • 基於註解方式實現

IOC操作Bean管理(基於xml方式)

  1. 基於xml方式建立物件
    <bean id = "user" class = "com.own.user"></bean>
  • 在spring配置檔案中,使用bean標籤,標籤裡面新增對應屬性,就可以實現物件建立
  • 在bean標籤中有很多屬性,介紹常用的屬性
    • id屬性:唯一標識
    • class屬性:類全路徑(包類路徑)
  • 建立物件時,預設執行無引數構造方法完成物件建立
  1. 基於xml方式注入屬性
  • DI:依賴注入,就是注入屬性

第一種注入方式:使用set方法注入

public class Book{
  //1. 建立屬性
  private String bname;
  //2. 建立屬性對應的set方法
  public void setBname(String bname){
    this.bname = bname;
  }
  public void say(){
    System.out.println("===>"+bname);
  }
}
  
  //3. xml進行配置
  <bean id = "book" class = "com.own.Book">
    <property name = "bname" value = "zhangsan"><property>
  </bean>  
  
  //4. 測試
  public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Book book = context.getBean("book",Book.class);
    System.out.println(book); 
    book.say();   
  }

  //原始方法:物件呼叫set方法
  public static void main(String[] args){
    Book book = new Book();
    book.setBname("abc");
  }

第二種注入方式:使用有參構造方法注入

public class Book{
  //1. 建立屬性
  private String bname;
  //2. 建立屬性對應的有參構造方法
  public Book(String bname){
    this.bname= bname;
  }
  public void say(){
    System.out.println("===>"+bname);
  }  
} 

  //3. xml進行配置
  <bean id = "book" class = "com.own.Book">
    //第一種方式:指定name  
    <constructor-arg name="bname" value="lee"><constructor-arg>
    //第二種方式:下標法
    <constructor-arg index="0" value="lee"><constructor-arg>
  </bean>  

  //4. 測試
  public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
    Book book = context.getBean("book",Book.class);
    System.out.println(book); 
    book.say();   
  }

  //原始方法
  public static void main(String[] args){
    Book book = new Book("abc");
  }

第三種注入方式:p名稱空間注入(瞭解)

  • 可以簡化基於xml配置方式
// 1. 新增p名稱空間在配置檔案中
<beans xmlns:p="http://www.springframework.org/schema/p">
  //2. 進行屬性注入,在bean標籤裡面進行操作,底層還是set注入
  <bean id = "book" class="com.own.Book" p:name="wanger"></bean>
</beans>

相關文章