先写一个比较常见的结构:
其中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方式注入。
时间: 2024-10-07 05:06:23