什麼是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>