1. 程式人生 > >Spring——setter方式注入和建構函式方式注入

Spring——setter方式注入和建構函式方式注入

     先寫一個比較常見的結構:

       其中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方式注入。