什麼是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解耦過程
-
xml配置檔案,配置建立的物件
<bean id = "own" class = "com.own.UserDao"></bean>
-
有service類和dao類,建立工廠類
class UserFactory{
public static UserDao getDao(){
String classValue = class屬性值; // 1.xml解析
Class clazz = Class.forName(classValue); // 2.通過反射建立物件
retuen (UserDao) clazz.newInstance();
}
}
- 進一步降低耦合度
IOC(介面)
-
IOC思想基於IOC容器完成,IOC容器底層就是物件工廠
-
Spring提供IOC容器實現兩種方式:(兩個介面)
- BeanFactory:IOC容器基本實現,是SPring內部的使用介面,比提供開發人員進行使用
- 載入配置檔案的時候不會建立物件,在獲取(使用)物件時才去建立物件
- ApplicationContext:BeanFactory介面的子介面,提供更多更強大的功能,一般由開發人員進行使用
- 載入配置檔案時就建立物件
- 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管理(概念)
- 什麼是Bean管理?
- Bean管理指的是兩個操作
- Spring建立物件
- Spring注入屬性
- Bean管理操作有兩種方式
- 基於xml配置檔案方式實現
- 基於註解方式實現
IOC操作Bean管理(基於xml方式)
- 基於xml方式建立物件
<bean id = "user" class = "com.own.user"></bean>
- 在spring配置檔案中,使用bean標籤,標籤裡面新增對應屬性,就可以實現物件建立
- 在bean標籤中有很多屬性,介紹常用的屬性
- id屬性:唯一標識
- class屬性:類全路徑(包類路徑)
- 建立物件時,預設執行無引數構造方法完成物件建立
- 基於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>