Spring——setter方式注入和建構函式方式注入
阿新 • • 發佈:2019-02-13
先寫一個比較常見的結構:
其中UserDao跟UserManagerImpl是層與層之間的介面。
下面用這些類來演示setter方式注入跟建構函式注入來解決Manager層注入Dao問題。
一,setter方式注入
首先要在Manager實現類中定義Dao的私有成員變數,併為此變數新增set方法,注入的時候會自動呼叫這個set方法對成員變數進行賦值。
之後在配置檔案中定義依賴關係:
<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-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <bean id="userDao4Mysql" class="com.shuitian.spring.dao.UserDaoForMysqlImpl"/> <bean id="userDao4Oracle" class="com.shuitian.spring.dao.UserDaoForOracleImpl"/> <bean id="UserManagerImpl" class="com.shuitian.spring.manager.UserManagerImpl"> <!-- 使用property注入物件 --> <property name="userDao" ref="userDao4Mysql"/> </bean> </beans
通過property中標籤中引入userDao4Mysql,將managerImpl實現類中配置好了Dao層具體的實現類。如果需要變動,只需改為上面配置的bean即可。
BeanFactory beanFactory=new ClassPathXmlApplicationContext("applicationContext.xml"); UserManager userManager=(UserManager)beanFactory.getBean("UserManagerImpl"); userManager.add("dd","d");
圍觀下呼叫Manager的過程:
沒使用注入:
@Override
public void add(String username, String password) {
//由我們的應用程式負責服務(物件)定位
UserDao userDao=new UserDaoForMysqlImpl();
userDao.addUser(username,password);
}
使用了注入後,userDao物件已經被注入了,至於注入的是哪個實現,不用管:
@Override public void add(String username, String password) { userDao.addUser(username,password); }
anyway,去掉了手動new的過程,不再將程式碼寫死了。
二,建構函式方式注入
Manager實現類中:
public UserManagerImpl(UserDao userDao) {
this.userDao = userDao;
}
將要注入的成員變數放入建構函式中,在實現類被初始的時候,進行注入。
配置注入關係:
<bean id="userDao4Mysql" class="com.shuitian.spring.dao.UserDaoForMysqlImpl"/>
<bean id="userDao4Oracle" class="com.shuitian.spring.dao.UserDaoForOracleImpl"/>
<bean id="UserManagerImpl" class="com.shuitian.spring.manager.UserManagerImpl">
<!-- 使用建構函式注入物件 -->
<constructor-arg ref="userDao4Mysql"></constructor-arg>
</bean>
兩種注入方式:
當需要注入的成員變數比較多的時候,使用建構函式注入的方式可能比較麻煩,所以一般推介使用setter方式注入。