在spring ioc中有三種依賴注入,分別是:https://blog.csdn.net/u010800201/article/details/72674420
a、接口注入;
b、setter方法注入;
c、構造方法注入;
d、注解方法注入;
接着小編對這四種注入方式一一進行講解,通過demo的講解,希望能夠幫助小伙伴們更好的理解,不足之處還請多多指教。
接口注入
- public class ClassA {
- private InterfaceB clzB;
- public void doSomething() {
- Ojbect obj = Class.forName(Config.BImplementation).newInstance();
- clzB = (InterfaceB)obj;
- clzB.doIt();
- }
- ……
- }
setter方法注入
setter注入模式在實際開發中有非常廣泛的應用,setter方法更加直觀,我們來看一下spring的配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
- <!-- 使用spring管理對象的創建,還有對象的依賴關系 -->
- <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
- <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
- <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
- <!-- (1)userManager使用了userDao,Ioc是自動創建相應的UserDao實現,都是由容器管理-->
- <!-- (2)在UserManager中提供構造函數,讓spring將UserDao實現注入(DI)過來 -->
- <!-- (3)讓spring管理我們對象的創建和依賴關系,必須將依賴關系配置到spring的核心配置文件中 -->
- <property name="userDao" ref="userDao4Oracle"></property>
- </bean>
- </beans>
- import com.tgb.spring.dao.UserDao;
- public class UserManagerImpl implements UserManager{
- private UserDao userDao;
- //使用設值方式賦值
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
- @Override
- public void addUser(String userName, String password) {
- userDao.addUser(userName, password);
- }
- }
構造器注入,即通過構造函數完成依賴關系的設定。我們看一下spring的配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
- <!-- 使用spring管理對象的創建,還有對象的依賴關系 -->
- <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
- <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
- <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
- <!-- (1)userManager使用了userDao,Ioc是自動創建相應的UserDao實現,都是由容器管理-->
- <!-- (2)在UserManager中提供構造函數,讓spring將UserDao實現注入(DI)過來 -->
- <!-- (3)讓spring管理我們對象的創建和依賴關系,必須將依賴關系配置到spring的核心配置文件中 -->
- <constructor-arg ref="userDao4Oracle"/>
- </bean>
- </beans>
- import com.tgb.spring.dao.UserDao;
- public class UserManagerImpl implements UserManager{
- private UserDao userDao4Oracle;
- //使用構造方式賦值
- public UserManagerImpl(UserDao userDao4Oracle) {
- this.userDao4Oracle = userDao4Oracle;
- }
- @Override
- public void addUser(String userName, String password) {
- userDao.addUser(userName, password);
- }
- }
注解注入
注解注入,即通過注解方式完成依賴關系的設定。我們看一下spring的配置文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
- http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
- http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd">
-
<context:annotation-config/>//啟動spring注解模式
- <!-- 使用spring管理對象的創建,還有對象的依賴關系 -->
- <bean id="userDao4Mysql" class="com.tgb.spring.dao.UserDao4MysqlImpl"/>
- <bean id="userDao4Oracle" class="com.tgb.spring.dao.UserDao4OracleImpl"/>
- <bean id="userManager" class="com.tgb.spring.manager.UserManagerImpl">
- <!--<property name="userDao" ref="userDao4Oracle"></property> --> //這段去掉
- </bean>
- </beans>
具體寫法:
- import com.tgb.spring.dao.UserDao;
- import javax.annotation.Resource; //需要導入相關jar包
- @Resource(name="userDao4Oracle")
- private UserDao userDao4Oracle;
- public class UserManagerImpl implements UserManager{
- private UserDao userDao4Oracle;
- @Override
- public void addUser(String userName, String password) {
- userDao.addUser(userName, password);
- }
- }
接口注入:
接口注入模式因為具備侵入性,它要求組件必須與特定的接口相關聯,因此並不被看好,實際使用有限。
Setter 注入:
對於習慣了傳統 javabean 開發的程序員,通過 setter 方法設定依賴關系更加直觀。如果依賴關系較為復雜,那么構造子注入模式的構造函數也會相當龐大,而此時設值注入模式則更為簡潔。如果用到了第三方類庫,可能要求我們的組件提供一個默認的構造函數,此時構造子注入模式也不適用。
構造器注入:
在構造期間完成一個完整的、合法的對象。所有依賴關系在構造函數中集中呈現。依賴關系在構造時由容器一次性設定,組件被創建之后一直處於相對“不變”的穩定狀態。只有組件的創建者關心其內部依賴關系,對調用者而言,該依賴關系處於“黑盒”之中。
注解注入:@Resource先會按照名稱到spring容器中查找,如果查找不到,就回退按照類型匹配,如果再沒有匹配到,就會拋出異常。如果在開發的時候,建議大家都是用@Resource(name=”userDao”),此時只能夠按照名稱匹配
小編寄語:該博文,小編主要介紹了控制反轉、依賴注入以及在spring中IOC的三種注入方式,配上demo進行講解,不足之處,還請各位小伙伴多多指教,其實小編覺得,無論是控制反轉還是依賴注入對編程帶來最大的影響不是從代碼上,而是思想上轉變,發生了“主從換位”的變化。應用程序原本是老大,要獲取什么資源都是主動出擊,但是在IoC/DI思想中,應用程序就變成被動的了,被動的等待IoC/DI容器來創建並注入她所需要的資源了。這一舉動,有效的分離了對象和她所需要的外部資源,使得它們松散耦合,有利於功能復用,更重要的是使得程序的整個體系結構變得非常靈活。


