Spring通過setter訪問器實現對屬性的賦值,這種做法稱為設值注入;Spring還提供了通過構造方法賦值的能力,稱為構造注入。使用設值注入時,Spring通過JavaBean的無參構造方法實例化對象。
public class UserServiceImpl implements UserService { private UserDao dao; public UserServiceImpl(UserDao dao){ this.dao = dao; } }
<bean id="userDao" class="edu.cn.dao.Impl.UserDaoImpl"/> <bean id="userService" class="edu.cn.service.Impl.UserServiceImpl"> <constructor-arg> <ref bean="userDao"/> </constructor-arg> </bean>
在Spring的配置文件中將DAO對象以構造注入的方式賦值給業務實例中的UserDao類型的屬性。
一個<constructor-arg>元素表示構造方法的一個參數,且使用時不區分順序。當構造方法的參數出現混淆、無法區分時,可以通過<constructor-arg>元素的index屬性指定該參數的位置索引,索引從0開始。<constructor-arg>元素還提供了type屬性用來指定參數的類型,避免字符串和基本數據類型的混淆。
構造注入的時效性好,在對象實例化時就得到所依賴的對象,便於在對象的初始化方法中使用依賴對象;但受限於方法重載的形式,使用靈活性不足。設值注入使用靈活,但時效性不足,大量的setter訪問器還增加了類的復雜性。Spring並不傾向於某種注入方式,用戶應該根據實際情況進行合理的選擇。當然Spring提供的注入方式不只這兩種,只是這兩種方式使用的最普遍。