1. 概述
? ? ? Spring IOC(Inversion of Control,控制反轉)是一種設計思想,通過依賴注入(Dependency Injection,DI)實現。它的核心思想是將對象的創建和依賴關系的管理交給Spring容器,從而降低代碼之間的耦合度,提高代碼的可維護性和可測試性。
2. 代碼示例分析
2.1 傳統方式
在沒有使用Spring之前,對象的創建和依賴關系的管理是由程序自身控制的。例如:
public class UserServiceImpl implements UserService {private UserDao userDao = new UserDaoOracleImpl();public void getUser() {userDao.getUser();}
}
這種方式的缺點是代碼耦合度高,修改和擴展困難。
2.2 使用Set方法注入
通過Set方法實現依賴注入,將對象的創建和依賴關系的管理交給Spring容器:
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}public void getUser() {userDao.getUser();}
}
這種方式使得程序從主動創建對象轉變為被動接受對象,降低了耦合度。
2.3 使用構造函數注入
通過構造函數注入,進一步簡化代碼:
public class UserServiceImpl implements UserService {private UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}public void getUser() {userDao.getUser();}
}
這種方式更加簡潔,但需要在Spring配置文件中進行相應的配置。
3. Spring配置文件
3.1.Spring IoC容器的工作原理:Spring IoC容器的主要作用是創建、管理和裝配Bean。
3.1.1?讀取配置文件
Spring IoC容器首先讀取配置文件(如applicationContext.xml
),文件中定義了Bean的創建和依賴關系。
3.1.2 根據元數據創建和組裝Bean
根據配置文件中的元數據,Spring IoC容器創建相應的Bean,并注入所需的依賴。
3.1.3 從容器中獲取Bean
? ? ? ?最后,應用程序可以從Spring IoC容器中獲取已經創建和配置好的Bean,Spring通過讀取配置文件(如applicationContext.xml
或beans.xml
)來創建和管理Bean。
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="mysqlImpl" class="com.kuang.dao.UserDaoMysqlImpl"/><bean id="oracleImpl" class="com.kuang.dao.UserDaoOracleImpl"/><bean id="userServiceImpl" class="com.kuang.service.UserServiceImpl"><!-- ref:引用Spring容器中創建好的對象 --><!-- value:具體的值,基本數據類型 --><property name="userDao" ref="mysqlImpl"/></bean>
</beans>
4. 控制反轉(IoC)的本質
? ? ? 控制反轉是一種通過描述(XML或注解)并通過第三方去生產或獲取特定對象的方式。在Spring中,IoC容器負責對象的創建、管理和裝配。
4.1 傳統方式與IoC方式的對比
傳統方式:程序主動創建對象,控制權在程序猿手上。
IoC方式:程序被動接收對象,控制權在Spring容器手中。
4.2 依賴注入(DI)
? ? ? 依賴注入是實現IoC的一種方法,通過構造函數、Set方法或注解等方式將依賴注入到對象中。
4.3 demo例子
pojo
public class Hello {private String str;public String getStr() {return str;}public void setStr(String str) {this.str = str;}@Overridepublic String toString() {return "Hello{" +"str='" + str + '\'' +'}';}
}
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 http://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="hello" class="com.WPS.pojo.Hello"><property name="str" value="Wupeisheng" /></bean></beans>
測試
/*** 測試類,用于演示如何使用Spring IoC容器來創建和管理Bean。*/
public class MyTest {/*** 主方法,程序的入口點。** @param args 命令行參數*/public static void main(String[] args) {// 創建一個ClassPathXmlApplicationContext對象,用于從類路徑下的beans.xml文件中加載Bean定義ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");// 從Spring IoC容器中獲取id為"hello"的Bean,并將其轉換為Hello類型Hello hello = (Hello) context.getBean("hello");// 打印Hello對象的字符串表示形式,通常重寫了toString方法以顯示有意義的信息System.out.println(hello.toString());}}
5. 總結
通過使用Spring的IoC容器,我們可以將對象的創建和管理交給Spring,從而降低代碼之間的耦合度,提高代碼的可維護性和可測試性。具體實現方式包括:
使用Set方法注入依賴
使用構造函數注入依賴
通過Spring配置文件管理Bean的創建和依賴注入
這種方式使得程序從主動創建對象轉變為被動接受對象,實現了控制反轉的設計思想。