先写一个比较常见的结构:
其中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方式注入。