天天看點

Spring核心之對 IOC的了解

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 管理了

Spring核心之對 IOC的了解

 注入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 值相同

Spring核心之對 IOC的了解

 可直接調用Service 方法

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

繼續閱讀