1. 程式人生 > >Spring核心之對 IOC的理解

Spring核心之對 IOC的理解

實現類 rac getbean 標簽 @override views img -h comm

Spring核心之對 IOC的理解

Spring是一個輕量級的控制反轉(IOC)和面向切面(AOP)的容器框架。

一 、IOC

IOC : Inversion of Control,中文譯為“控制反轉

”,IOC不是一種技術,而是一種設計思想

Ioc意味著將設計好的對象交給容器控制,而不是傳統的在對象內部直接通過new進行創建對象。

傳統的程序設計是通過new主動創建對象,然後再通過對象調用方法,類似以下代碼:

1 、先創建一個接口:

  1. public interface UserDao {
  2. public void save();
  3. }

2 、創建接口的實現類:

  1. public class UserDaoImpl implements UserDao {
  2. @Override
  3. public void save() {
  4. System.out.println("save方法執行了..."
    );
  5. }
  6. }

3、編寫一個測試類:通過new主動創建對象並調用方法

  1. public class SpringDemo1 {
  2. @Test
  3. /**
  4. * 傳統方式的調用
  5. */
  6. public void demo1(){
  7. UserDao userDao = new UserDaoImpl(); //創建對象
  8. userDao.save(); //通過對象調用方法
  9. }
  10. }

這樣的程序設計會導致類與類之間高耦合,一旦後期維護,程序不想通過UserDaoImpl 來實例化userDao對象,而想通過另一個實現類 UserDaoIocImpl 來實例化userDao對象 ,就需要修改源代碼為 UserDao userDao = new UserDaoIocImpl();

不易於後期維護。

IOC :將設計好的對象交給容器控制,由容器幫我們創建並實例化對象 ,而我們可以通過外部xml配置文件來告訴容器我們需要哪個實現類來實例化對象 ,一旦我們需要更改實現類,則直接修改xml配置文件即可。就能夠在不修改源代碼的情況下,維護程序。

首先編寫一個將對象交給容器控制的程序:

1 、先創建一個接口:

  1. public interface UserDao {
  2. public void save();
  3. }

2 、創建接口的實現類:

  1. public class UserDaoImpl implements UserDao {
  2. @Override
  3. public void save() {
  4. System.out.println("IOC容器調用的save方法執行了...");
  5. }
  6. }

3 、創建applicationContext.xml配置文件,將實現類交給Spring管理,即告訴容器調用哪個實現類實例化對象

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="
  7. http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd">
  9. <!-- 設置一個id, class為實現類的全路徑,告訴容器調用這個實現類實例化對象-->
  10. <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"></bean>
  11. </beans>

4 、編寫測試類

  1. public class SpringDemo1 {
  2. @Test
  3. /**
  4. * Spring IOC容器的方式的調用
  5. */
  6. public void demo2(){
  7. // 創建Spring的工廠來加載xml配置文件
  8. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  9. //讀取到我們告訴容器需要哪個實現類來實例化對象
  10. UserDao userDao = (UserDao) applicationContext.getBean("userDao"); //此處的參數為xml配置文件中 <bean>標簽中id的值
  11. userDao.save();
  12. }

當我們需要將實現類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 方法

  1. public class UserDaoImpl implements UserDao {
  2. //依賴註入
  3. private String name;
  4. public void setName(String name) {
  5. this.name = name;
  6. }
  7. @Override
  8. public void save() {
  9. System.out.println("save方法執行了..."+name); //執行時直接使用註入的屬性
  10. }
  11. }

在xml配置文件中通過<property>標簽為 name 屬性賦值

  1. <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl">
  2. <property name="name" value="依賴註入的name屬性"></property>
  3. </bean>

2 、當我們需要 調用業務層 Service 方法時 也可註入Service ,前提是在IOC環境下,即Service實現類也交給了Spring 管理了

技術分享圖片

註入Service,提供 set 方法

  1. //註入Service
  2. private UserService userService;
  3. //提供Set方法
  4. public void setUserService(UserService userService) {
  5. this.userService = userService;
  6. }

在xml配置文件中通過<property>標簽來配置Service ,name 和 ref 屬性值與配置Service 是 id 值相同

技術分享圖片

可直接調用Service 方法

  1. public String regist(){
  2. userService.regist(user); //調用依賴註入的Service方法
  3. return LOGIN;
  4. }

Spring核心之對 IOC的理解