Spring——setter方式注入和构造函数方式注入
2015-12-31 15:28
477 查看
先写一个比较常见的结构:
其中UserDao跟UserManagerImpl是层与层之间的接口。
下面用这些类来演示setter方式注入跟构造函数注入来解决Manager层注入Dao问题。
之后在配置文件中定义依赖关系:
<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的过程,不再将代码写死了。
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方式注入。
其中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方式注入。
相关文章推荐
- 中文编码--深入分析 Java 中的中文编码问题
- Spring auto wire(自动装配) 的 五种方式
- java7.instance of关键字
- java final关键字
- java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment求大神解答
- 设计模式--Java 设计模式与建模专题
- java连接hdfs ha和调用mapreduce jar示例
- java_web学习笔记之Servlet
- java编写简单消息队列,实现高德坐标变形服务
- Spring MVC - log4j 配置
- java6.多态性
- Maven使用-利用Maven引入相关包(Struts2)
- java笔记--设计模式之工厂模式
- java foreach 与 js for/in
- 从头认识java-15.7 Map(3)-介绍HashMap的工作原理-get方法
- java写文件的几种方式
- Struts2 include(包含)多个配置文件
- 通过eclipse对apk加密混淆的方法
- 带返回值的线程
- java的System.getProperty()方法可以获取的值