javascript
Spring核心之对 IOC的理解
Spring核心之對(duì) IOC的理解
? ? ? ? ?
? ? ? ? ? ? ? ?Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IOC)和面向切面(AOP)的容器框架。
一 、IOC
?IOC : Inversion of Control,中文譯為“控制反轉(zhuǎn)”,IOC不是一種技術(shù),而是一種設(shè)計(jì)思想。
? ? ? ? ? ? ? Ioc意味著將設(shè)計(jì)好的對(duì)象交給容器控制,而不是傳統(tǒng)的在對(duì)象內(nèi)部直接通過new進(jìn)行創(chuàng)建對(duì)象。
?傳統(tǒng)的程序設(shè)計(jì)是通過new主動(dòng)創(chuàng)建對(duì)象,然后再通過對(duì)象調(diào)用方法,類似以下代碼:
1 、先創(chuàng)建一個(gè)接口:
public interface UserDao { public void save();}2 、創(chuàng)建接口的實(shí)現(xiàn)類:
public class UserDaoImpl implements UserDao { public void save() { System.out.println("save方法執(zhí)行了..."); } }3、編寫一個(gè)測試類:通過new主動(dòng)創(chuàng)建對(duì)象并調(diào)用方法
public class SpringDemo1 { /** * 傳統(tǒng)方式的調(diào)用 */ public void demo1(){ UserDao userDao = new UserDaoImpl(); //創(chuàng)建對(duì)象 userDao.save(); //通過對(duì)象調(diào)用方法 } }? ? ? 這樣的程序設(shè)計(jì)會(huì)導(dǎo)致類與類之間高耦合,一旦后期維護(hù),程序不想通過UserDaoImpl 來實(shí)例化userDao對(duì)象,而想通過另一個(gè)實(shí)現(xiàn)類 UserDaoIocImpl 來實(shí)例化userDao對(duì)象 ,就需要修改源代碼為 UserDao userDao = new UserDaoIocImpl();???不易于后期維護(hù)。
IOC :將設(shè)計(jì)好的對(duì)象交給容器控制,由容器幫我們創(chuàng)建并實(shí)例化對(duì)象 ,而我們可以通過外部xml配置文件來告訴容器我們需要哪個(gè)實(shí)現(xiàn)類來實(shí)例化對(duì)象?,一旦我們需要更改實(shí)現(xiàn)類,則直接修改xml配置文件即可。就能夠在不修改源代碼的情況下,維護(hù)程序。??
首先編寫一個(gè)將對(duì)象交給容器控制的程序:
1 、先創(chuàng)建一個(gè)接口:
public interface UserDao { public void save();}2 、創(chuàng)建接口的實(shí)現(xiàn)類:?
public class UserDaoImpl implements UserDao { public void save() { System.out.println("IOC容器調(diào)用的save方法執(zhí)行了..."); } }?3 、創(chuàng)建applicationContext.xml配置文件,將實(shí)現(xiàn)類交給Spring管理,即告訴容器調(diào)用哪個(gè)實(shí)現(xiàn)類實(shí)例化對(duì)象
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"> <!-- 設(shè)置一個(gè)id, class為實(shí)現(xiàn)類的全路徑,告訴容器調(diào)用這個(gè)實(shí)現(xiàn)類實(shí)例化對(duì)象--> <bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"></bean> </beans>4 、編寫測試類
public class SpringDemo1 { /** * Spring IOC容器的方式的調(diào)用 */ public void demo2(){ // 創(chuàng)建Spring的工廠來加載xml配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); //讀取到我們告訴容器需要哪個(gè)實(shí)現(xiàn)類來實(shí)例化對(duì)象 UserDao userDao = (UserDao) applicationContext.getBean("userDao"); //此處的參數(shù)為xml配置文件中 <bean>標(biāo)簽中id的值 userDao.save(); }當(dāng)我們需要將實(shí)現(xiàn)類UserDaoImpl更換為UserDaoIocImpl時(shí),只需修改xml配置文件<bean>標(biāo)簽中 class 的路徑,將其修改為UserDaoIocImpl 類的全路徑即可,其余代碼無需修改
<bean id="userDao" class="com.czm.spring.demo1.UserDaoIocImpl"></bean>?
二 、DI
DI :Dependency Injection,即“依賴注入” 。在IOC環(huán)境下,Spring管理的這個(gè)實(shí)現(xiàn)類在執(zhí)行時(shí)依賴的一些屬性,可直接在類? ? ? ? ? 中注入,以供使用。
1 、比如?UserDaoImpl 實(shí)現(xiàn)類在執(zhí)行時(shí)需要用到 name 屬性,可直接定義 name 屬性并提供 set 方法
public class UserDaoImpl implements UserDao { //依賴注入 private String name; public void setName(String name) { this.name = name; } public void save() { System.out.println("save方法執(zhí)行了..."+name); //執(zhí)行時(shí)直接使用注入的屬性 } }? 在xml配置文件中通過<property>標(biāo)簽為 name 屬性賦值
<bean id="userDao" class="com.czm.spring.demo1.UserDaoImpl"> <property name="name" value="依賴注入的name屬性"></property> </bean>?
?
2 、當(dāng)我們需要 調(diào)用業(yè)務(wù)層 Service 方法時(shí) 也可注入Service? ,前提是在IOC環(huán)境下,即Service實(shí)現(xiàn)類也交給了Spring 管理了
?注入Service,提供 set 方法
//注入Service private UserService userService; //提供Set方法 public void setUserService(UserService userService) { this.userService = userService; }在xml配置文件中通過<property>標(biāo)簽來配置Service ,name 和 ref 屬性值與配置Service 是 id 值相同
?可直接調(diào)用Service 方法
public String regist(){ userService.regist(user); //調(diào)用依賴注入的Service方法 return LOGIN; }?
轉(zhuǎn)載于:https://www.cnblogs.com/czmblog0/p/10540127.html
總結(jié)
以上是生活随笔為你收集整理的Spring核心之对 IOC的理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员下班回家,路上被拦…
- 下一篇: 将0移到最后,在原数组操作,并且不能改变