javascript
Spring依赖注入和控制反转
文章目錄
- 1、依賴注入
- 1.1、依賴注入和控制反轉(zhuǎn)的概念
- 1.2、依賴注入的實(shí)現(xiàn)方式
- 1.3、控制反轉(zhuǎn)的具體實(shí)現(xiàn)
- 1.4、依賴注入的具體實(shí)現(xiàn)
- 1.5、依賴注入和控制反轉(zhuǎn)總結(jié)
1、依賴注入
1.1、依賴注入和控制反轉(zhuǎn)的概念
依賴注入(Dependency Injection, 簡(jiǎn)稱DI)與控制反轉(zhuǎn)(IoC)的含義相同,只不過這兩個(gè)稱呼是從兩個(gè)角度描述的同一個(gè)概念。
當(dāng)某個(gè)Java對(duì)象(調(diào)用者)需要調(diào)用另一個(gè)Java對(duì)象(被調(diào)用者,即被依賴對(duì)象)時(shí),在傳統(tǒng)模式下,調(diào)用者通常會(huì)采用“new被調(diào)用者”的代碼方式來(lái)創(chuàng)建對(duì)象,如圖所示。這種方式會(huì)導(dǎo)致調(diào)用者與被調(diào)用者之間的耦合性增加,不利于后期項(xiàng)目的升級(jí)和維護(hù)。
在使用Spring框架之后,對(duì)象的實(shí)例不再由調(diào)用者來(lái)創(chuàng)建,而是由Spring 容器來(lái)創(chuàng)建,Spring容器會(huì)負(fù)責(zé)控制程序之間的關(guān)系,而不是由調(diào)用者的程序代碼直接控制。這樣,控制權(quán)由應(yīng)用代碼轉(zhuǎn)移到了Spring 容器,控制權(quán)發(fā)生了反轉(zhuǎn),這就是Spring的控制反轉(zhuǎn)。
從Spring容器的角度來(lái)看,Spring 容器負(fù)責(zé)將被依賴對(duì)象賦值給調(diào)用者的成員變量,這相
當(dāng)于為調(diào)用者注入了它依賴的實(shí)例,這就是Spring的依賴注入。
1.2、依賴注入的實(shí)現(xiàn)方式
- 屬性setter方法注入:指Spring容器使用setter 方法注入被依賴的實(shí)例。通過調(diào)用無(wú)參
構(gòu)造器或無(wú)參靜態(tài)工廠方法實(shí)例化Bean后,調(diào)用該Bean的setter 方法,即可實(shí)現(xiàn)基于setter
方法的依賴注入。 - 構(gòu)造方法注入:指Spring容器使用構(gòu)造方法注入被依賴的實(shí)例。基于構(gòu)造方法的依賴注
入通過調(diào)用帶參數(shù)的構(gòu)造方法來(lái)實(shí)現(xiàn),每個(gè)參數(shù)代表著一個(gè)依賴。
1.3、控制反轉(zhuǎn)的具體實(shí)現(xiàn)
1.接口
package com.nynu.qdy.ioc; public interface UserDao{public void say() ; }2.接口實(shí)現(xiàn)類
package com.nynu.qdy.impl;import com.nynu.qdy.ioc.UserDao;public class UserDaolmpl implements UserDao{public void say() {System.out.println("userDao say hello World!");} }3.Spring的配置文件applicationContext.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-4.3.xsd"><!-- 將指定類配置給Spring,讓Spring創(chuàng)建其對(duì)象的實(shí)例 --><!-- 這是SpringIOC容器的控制反轉(zhuǎn)機(jī)制 --><bean id="userDao" class="com.nynu.qdy.impl.UserDaolmpl"> </beans>4.測(cè)試類
package com.nynu.qdy.ioc;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestloC {@SuppressWarnings("resource")public static void main(String[] args) {// 1.初始化spring容器,加載配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 2.通過容器獲取userDao容器UserDao userDao = (UserDao) applicationContext.getBean("userDao");// 3.調(diào)用實(shí)例中的方法userDao.say();} }5.結(jié)果
userDao say hello World!1.4、依賴注入的具體實(shí)現(xiàn)
1.接口
package com.nynu.qdy.ioc;public interface UserService {public void say(); }2.實(shí)現(xiàn)類
package com.nynu.qdy.impl;import com.nynu.qdy.ioc.UserDao; import com.nynu.qdy.ioc.UserService;public class UserServiceImpl implements UserService {// 生命UserDao屬性private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}// 實(shí)現(xiàn)接口中的方法public void say() {// 調(diào)用userDao中的say()方法,并執(zhí)行輸出語(yǔ)句this.userDao.say();System.out.println("userService say hello WOrld!");}}3.配置文件applicationContext.xml
<!--添加一個(gè)id為userService的實(shí)例 --><!-- 將id為userDao的Bean實(shí)例注入到userService實(shí)例中 --></bean><bean id="userService" class="com.nynu.qdy.impl.UserServiceImpl"><!-- 完成屬性賦值 --><property name="userDao" ref="userDao" /></bean>4.測(cè)試類
package com.nynu.qdy.ioc;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestDI {@SuppressWarnings("resource")public static void main(String[] args) {// 1.初始化spring容器,加載配置文件ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");// 2.通過容器獲取UserService實(shí)例UserService userService = (UserService) applicationContext.getBean("userService");// 3.調(diào)用實(shí)例中的say()方法userService.say();} }5.結(jié)果
userDao say hello World! userService say hello WOrld!1.5、依賴注入和控制反轉(zhuǎn)總結(jié)
這里是對(duì)ioc和di的總結(jié)和理解!
總結(jié)
以上是生活随笔為你收集整理的Spring依赖注入和控制反转的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring 知识点详解
- 下一篇: Spring中的Bean配置、属性配置、