贛深高鐵全線鋪通:設計時速 350 公里,今年底將開通運營
阿新 • • 發佈:2021-06-12
IOC
我們之前的業務中,使用者的需求可能會影響我們原來程式碼,我們需要根據使用者的需求去修改原始碼,如果程式的程式碼量十分巨大,修改一次的成本代價十分昂貴!
原來:
private UserDao userDao=new UserDaoImpl();
我們使用一個set介面實現,已經發生了革命性的變化
private UserDao userDao;
//利用set進行動態實現值的注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Test public void test(){ UserService userService = new UserServiceImpl(); // ((UserServiceImpl) userService).setUserDao(new UserDaoImpl()); 可轉變多個實現類 ((UserServiceImpl) userService).setUserDao(new UserDaoMysqlImpl()); userService.getUser(); }
-
之前,程式是主動建立物件,控制權在程式猿手上
-
使用了set注入後,程式不在具有主動權,而是變成了被動的接受物件
這種思想,從本質上解決了問題,我們程式猿不用再去管理物件的建立了。系統的耦合性大大降低,可以更加專注的在業務的實現上,這是IOC的原型。
本質
控制反轉(IOC:Inversion of Control)不是什麼技術,而是一種設計思想
DI(依賴注入)是實現IOC的一種方法。
也有人認為DI只是IOC的另一種說法,沒有IOC的程式中,我們使用面向物件程式設計,物件的建立與物件間的依賴關係完全硬編碼在程式中,物件的建立由程式自己控制,控制反轉後將物件的建立轉移給第三方,個人認為所謂的控制反轉就是:獲得依賴物件的方式反轉了
IoC是Spring框架的核心內容,使用多種方式完美的實現IoC,可以使用XML配置,也可以使用註解,新版本的Spring也可以零配置實現IoC。
Spring容器在初始化時先讀取配置檔案,根據配置檔案或元資料建立與組織物件存入容器中,程式使用時再從IoC容器中取出需要的物件。
控制反轉是一種通過描述(XML或者註解)並通過第三方去生產或獲取特定物件的方式。在Spring中實現控制反轉的是IOC容器,其實現方法就是依賴注入!
HelloSpring
新建一個pojo包,在包下建立一個Hello實體類
public class Hello { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Hello{" + "name='" + name + '\'' + '}'; } }
新增Spring配置檔案 beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 使用Spring來建立物件 在Spring中這些都稱為Bean
Hello hell = new Hello()
bean = 物件 new Hello()
id=變數名 hello
class=new Hello()
property 相當於給物件中的屬性設定一個值
ref:引用Spring容器中建立好的物件id
Values: 具體的值,基本資料型別和String
-->
<bean id="hello" class="com.dada.pojo.Hello">
<property name="name" value="Spring"></property>
</bean>
</beans>
- id=變數名 hello
- class=new Hello()
- property 相當於給物件中的屬性設定一個值
- ref:引用Spring容器中建立好的物件id
- Values: 具體的值,基本資料型別和String
測試程式碼
@Test
public void test(){
//獲取Spring的上下文物件
ApplicationContext context=new ClassPathXmlApplicationContext("beans.xml");
//我們的物件現在都在Spring中管理了。我們要使用直接去裡面取出來就可以了
Hello hello = (Hello) context.getBean("hello");
System.out.println(hello);
}
Hello物件是誰建立的?
- hello物件是由Spring建立的
Hello物件的屬性是怎樣設定的? - 是由Spring容器設定的
- 這個過程叫做控制反轉
- 控制
- 誰來控制物件的建立,傳統應用程式的物件是由程式本身控制建立的,使用Spring後,物件是由Spring來建立的。
- 反轉
- 程式本身不建立物件,而變成被動的接受物件。
- 依賴注入
- 就是利用set方法進行注入的
- IoC是一種程式設計思想,有主動的程式設計變成被動的接收
- IoC:物件由容器建立、管理和配置。