什麼是Spring IOC容器?
IOC容器,全稱(Inversion of Control),即控制反轉,是Spring框架的核心功能之一,它把傳統上由程序代碼直接操控的對象調用權交給了容器,通過容器來實現對象組件的裝配和管理,利用了java反射機制。
Spring IOC負責創建對象,管理對象(通過依賴注入(DI)),裝配對象,配置對象,並且管理這些對象的整個生命週期,所以IOC就像一個存放對象的容器。
通俗理解,就是使用者只需要把自己需要用到的對象告知Spring,然後直接聲明使用,Spring就可以把這些所需的對象創建準備好,要用的時候直接就可以拿來用了,這樣就不需要在程序中創建對象,消除了硬編碼,降低了類之間的依賴關係。
好處:在實際的項目開發中,往往需要通過類與類之間的相互協作來完成特定的業務邏輯,這個時候,沒個類都要管理與自己有交互的類的引用和依賴,這樣就使得代碼的維護異常困難並且耦合度過高,而IOC的出現就是爲了解決這個問題,IOC將類與類的依賴關係寫在配置文件中,程序在運行時根據配置文件動態加載依賴的類,降低了類與類之間的耦合度。
Spring IOC實現方式:
1. 依賴查找(DL):這種方式已經被拋棄了,因爲它需要用戶自己去使用API進行查找資源和組裝對象。有侵入性。
2. 依賴注入(DI):Set注入、構造器注入、註解注入
Spring的IOC支持以下功能:
1. 依賴注入
2. 依賴檢查
3. 自動裝配
4. 支持集合
5. 指定初始化方法和銷燬方法
6. 支持回調某些方法(需要實現Spring接口,略有侵入)
舉例說明:
調用用戶User對象,首先來創建一個User對象實體類
public class user{
private String name;
private Integer age;
//構造器
public user(){}
public user(String name, Integer age){
super();
this.name = name;
this.age = age;
}
//set,get方法這就不寫了……
}
利用Spring來創建這個類的對象
<?xml version=“1.0” encoding=“UTF-8“?>
<beans xmlns=“http://www.springfrmework.org/schema/beans”
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=“http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd”>
<!—-創建user對象—->
<bean id=“u1” class=“com.xxx.user”>
<!—- set注入 —->
<!—— DI 依賴注入在創建這個對象的時候調用這個對象的屬性完成賦值—->
<property name=“name” value=“Zhangsan”/>
<property name=“age” value=“18”/>
<!—-構造器注入 —->
<constructor-arg name=“name” value=“Zhangsan”/>
<constructor-age name=“age” value=“18”/>
</bean>
</beans>
調用user對象類
public class test{
public static void main(String[] arg){
ApplicationContext context = new ClassPathXmlAppliactionContext(“applicationContext.xml”);
user userObj = (user) context.getBean(“u1”);
System.out.println(userObj);
}
}
以上兩種講的是set注入和構造器注入,接下來講解下註解注入方式;
配置applicationContext.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” xmlns:context=“http://www.springframework.org/schema/context” xsi:schemaLocation=“http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd”>
<!—- 開啓自動掃描xxx.ioc包下的所有類的註解—->
<context:component-scan base-package=“Xxx.ioc”></context:component-scan>
</beans>
註解注入類
package xxx.ioc;
public interface userDao{
public void get();
}
package xxx.ioc;
import org.springfremawork.stereotype.Component;
@Component(“userDao”)//相當於<bean id=“userDao” class=“Xxx.ioc.userDaoImpl”/>
public class userDaoImpl implements userDao{
@Value(“張三”)
private String name;
public void get(){
System.out.println(“參數是:” + name);
}
}