原
Spring核心之對 IOC的了解
Spring是一個輕量級的控制反轉(IOC)和面向切面(AOP)的容器架構。
一 、IOC
IOC : Inversion of Control,中文譯為“控制反轉”,IOC不是一種技術,而是一種設計思想。
Ioc意味着将設計好的對象交給容器控制,而不是傳統的在對象内部直接通過new進行建立對象。
傳統的程式設計是通過new主動建立對象,然後再通過對象調用方法,類似以下代碼:
1 、先建立一個接口:
- public interface UserDao {
- public void save();
- }
2 、建立接口的實作類:
- public class UserDaoImpl implements UserDao {
- @Override
- public void save() {
- System.out.println("save方法執行了...");
- }
- }
3、編寫一個測試類:通過new主動建立對象并調用方法
- public class SpringDemo1 {
- @Test
- /**
- * 傳統方式的調用
- */
- public void demo1(){
- UserDao userDao = new UserDaoImpl(); //建立對象
- userDao.save(); //通過對象調用方法
- }
- }
這樣的程式設計會導緻類與類之間高耦合,一旦後期維護,程式不想通過UserDaoImpl 來執行個體化userDao對象,而想通過另一個實作類 UserDaoIocImpl 來執行個體化userDao對象 ,就需要修改源代碼為 UserDao userDao = new UserDaoIocImpl(); 不易于後期維護。
IOC :将設計好的對象交給容器控制,由容器幫我們建立并執行個體化對象 ,而我們可以通過外部xml配置檔案來告訴容器我們需要哪個實作類來執行個體化對象 ,一旦我們需要更改實作類,則直接修改xml配置檔案即可。就能夠在不修改源代碼的情況下,維護程式。
首先編寫一個将對象交給容器控制的程式:
1 、先建立一個接口:
- public interface UserDao {
- public void save();
- }
2 、建立接口的實作類:
- public class UserDaoImpl implements UserDao {
- @Override
- public void save() {
- System.out.println("IOC容器調用的save方法執行了...");
- }
- }
3 、建立applicationContext.xml配置檔案,将實作類交給Spring管理,即告訴容器調用哪個實作類執行個體化對象
- <?xml version="1.0" encoding="UTF-8"?>
- <beans
- xmlns="http://www.springframework.org/schema/beans"
- xmlns:p="http://www.springframework.org/schema/p"
- 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">
- <!-- 設定一個id, class為實作類的全路徑,告訴容器調用這個實作類執行個體化對象-->
- <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"></bean>
- </beans>
4 、編寫測試類
- public class SpringDemo1 {
- @Test
- /**
- * Spring IOC容器的方式的調用
- */
- public void demo2(){
- // 建立Spring的工廠來加載xml配置檔案
- ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
- //讀取到我們告訴容器需要哪個實作類來執行個體化對象
- UserDao userDao = (UserDao) applicationContext.getBean("userDao"); //此處的參數為xml配置檔案中 <bean>标簽中id的值
- userDao.save();
- }
當我們需要将實作類UserDaoImpl更換為UserDaoIocImpl時,隻需修改xml配置檔案<bean>标簽中 class 的路徑,将其修改為UserDaoIocImpl 類的全路徑即可,其餘代碼無需修改
<bean id="userDao" class="com.czm.spring.demo1.UserDaoIocImpl"></bean>
二 、DI
DI :Dependency Injection,即“依賴注入” 。在IOC環境下,Spring管理的這個實作類在執行時依賴的一些屬性,可直接在類 中注入,以供使用。
1 、比如 UserDaoImpl 實作類在執行時需要用到 name 屬性,可直接定義 name 屬性并提供 set 方法
- public class UserDaoImpl implements UserDao {
- //依賴注入
- private String name;
- public void setName(String name) {
- this.name = name;
- }
- @Override
- public void save() {
- System.out.println("save方法執行了..."+name); //執行時直接使用注入的屬性
- }
- }
在xml配置檔案中通過<property>标簽為 name 屬性指派
- <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl">
- <property name="name" value="依賴注入的name屬性"></property>
- </bean>
2 、當我們需要 調用業務層 Service 方法時 也可注入Service ,前提是在IOC環境下,即Service實作類也交給了Spring 管理了
注入Service,提供 set 方法
- //注入Service
- private UserService userService;
- //提供Set方法
- public void setUserService(UserService userService) {
- this.userService = userService;
- }
在xml配置檔案中通過<property>标簽來配置Service ,name 和 ref 屬性值與配置Service 是 id 值相同
可直接調用Service 方法
- public String regist(){
- userService.regist(user); //調用依賴注入的Service方法
- return LOGIN;
- }