更新時(shí)間:2022-05-27 來(lái)源:黑馬程序員 瀏覽量:
DI的全稱(chēng)是Dependency Injection,中文稱(chēng)之為依賴(lài)注入。它與控制反轉(zhuǎn)(IoC)的含義相同,只不過(guò)這兩個(gè)稱(chēng)呼是從兩個(gè)角度描述的同一個(gè)概念。
IoC
在使用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),這就是控制反轉(zhuǎn)。
DI
從Spring容器的角度來(lái)看,Spring容器負(fù)責(zé)將被依賴(lài)對(duì)象賦值給調(diào)用者的成員變量,這相當(dāng)于為調(diào)用者注入了它依賴(lài)的實(shí)例,這就是Spring的依賴(lài)注入。
使用setter方法實(shí)現(xiàn)依賴(lài)注入
1.在com.itheima.ioc包中,創(chuàng)建接口UserService,在接口中編寫(xiě)一個(gè)say()方法。
package com.itheima.ioc; public interface UserService { public void say(); }
2.在com.itheima.ioc包中,創(chuàng)建UserService接口的實(shí)現(xiàn)類(lèi)UserServiceImpl,在類(lèi)中聲明userDao屬性,并添加屬性的setter方法。
package com.itheima.ioc; public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void say(){ this.userDao.say(); System.out.println("userService say hello World !"); } }
3.在配置文件applicationContext.xml中,創(chuàng)建一個(gè)id為userService的Bean,該Bean用于實(shí)例化UserServiceImpl類(lèi)的信息,并將userDao的實(shí)例注入到userService中。
<bean id="userService" class="com.itheima.ioc.UserServiceImpl"> <property name="userDao" ref="userDao"/> </bean>
4.在com.itheima.ioc包中,創(chuàng)建測(cè)試類(lèi)TestDI,來(lái)對(duì)程序進(jìn)行測(cè)試。
package com.itheima.ioc; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestDI { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService)applicationContext.getBean("userService"); userService.say(); } }
5.執(zhí)行程序后,控制臺(tái)的輸出結(jié)果如圖所示。