【SSH快速进阶】——Spring IOC容器注入的几种方式
来源:互联网 发布:cydia软件源 sim 编辑:程序博客网 时间:2024/05/21 07:56
IOC(Inversion of Control):控制反转,怎么理解这句话呢?看一个例子就明白了。
一个操作用户的Dao层接口UserDao :
public interface UserDao { public void addUser(String username,String password);}
UserDao 的两个实现类(Oracle版本和MySql版本):
public class UserDao4OracleImpl implements UserDao{ @Override public void addUser(String username, String password) { System.out.println("UserDao4Oracle实现添加用户"); }}
public class UserDao4MySqlImpl implements UserDao { @Override public void addUser(String username, String password) { System.out.println("UserDao4MySqlImpl实现添加用户"); }}
在Service的实现类中调用UserDao接口时,需要手动new实现该接口的实现类:
public class UserManagerImpl implements UserManager{ @Override public void addUser(String username, String password) { //由应用程序自己来负责服务(对象)定位 UserDao userDao =new UserDao4MySqlImpl(); userDao.addUser("DannyHoo", "123456"); }}
在上面的代码看出来,在使用userDao接口时,需要在这里主动找mysql的实现类UserDao4MySqlImpl,而IOC的工作就是自动为我们实例化。
控制反转的意思在这里就体现出来了,把原本由程序管理Bean的工作(实例化、各种依赖引用等)反交给IOC容器来做。
利用IOC容器来为我们管理Bean的方式有多种:
1、构造方法注入
在需要注入的Service实现类中添加userDao的引用,一个构造方法,参数为需要注入的userDao:
public class UserManagerImpl implements UserManager{ //用构造方法构造UserDao,不依赖具体实现 private UserDao userDao; //如果有多个依赖,构造方法可以配置多个参数 public UserManagerImpl(UserDao userDao){ this.userDao=userDao; } @Override public void addUser(String username, String password){ userDao.addUser(username,password); }}
上面用构造方法构造UserDao,不依赖具体实现。
在Spring配置文件中的配置如下
<bean id="userDao4MySql" class="com.danny.spring.dao.UserDao4MySqlImpl"></bean><bean id="userDao4Oracle" class="com.danny.spring.dao.UserDao4OracleImpl"></bean><bean id="userManager" class="com.danny.spring.manager.UserManagerImpl"> <!-- 依赖查找,可以构造多个参数依赖,顺序随意 --> <constructor-arg ref="userDao4MySql"/></bean>
2、Setter注入
Setter注入就是用Setter方法代替了上面的构造方法,IOC容器利用Setter方法来给需要注入的引用赋值。这是最常用的方式。
添加Setter 方法:
public class UserManagerImpl implements UserManager{ private UserDao userDao; //setter注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void addUser(String username, String password) { userDao.addUser(username,password); }}
在Spring配置文件中的配置如下
<bean id="userDao4MySql" class="com.danny.spring.dao.UserDao4MySqlImpl"></bean><bean id="userDao4Oracle" class="com.danny.spring.dao.UserDao4OracleImpl"></bean><bean id="userManager" class="com.danny.spring.manager.UserManagerImpl"> <property name="userDao" ref="userDao4MySql"/></bean>
3、静态工厂注入
当我们通过静态工厂来获取Dao的实例时,比如再添加一个UserDaoFactory
public class UserDaoFactory { //生产UserDao4MySqlImpl实例 public static final UserDao4MySqlImpl getUserDao4MySqlImpl(){ return new UserDao4MySqlImpl(); } //生产UserDao4OracleImpl实例 public static final UserDao4OracleImpl getUserDao4OracleImpl(){ return new UserDao4OracleImpl(); }}
UserManagerImpl中的代码还跟Setter注入的代码一样:
public class UserManagerImpl implements UserManager{ private UserDao userDao; //setter注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void addUser(String username, String password) { userDao.addUser(username,password); }}
但是配置文件不一样:
<bean id="userDao4MySql" class="com.danny.spring.dao.UserDaoFactory" factory-method="getUserDao4MySqlImpl"/><bean id="userDao4Oracle" class="com.danny.spring.dao.UserDaoFactory" factory-method="getUserDao4OracleImpl"/><bean id="userManager" class="com.danny.spring.manager.UserManagerImpl"> <property name="userDao" ref="userDao4MySql"/></bean>
上面配置文件中,userManager的注入的参数仍然是userDao,ref是userDao4MySql或userDao4Oracle,userDao4MySql和userDao4Oracle,他们的的class不再指向自己,而是指向生产他们的静态工厂,factory-method
则是生产他们的方法。
【 转载请注明出处——胡玉洋《【SSH快速进阶】——Spring IOC容器注入的几种方式》】
- 【SSH快速进阶】——Spring IOC容器注入的几种方式
- Spring的IOC容器—依赖注入
- spring详解:spring IOC依赖注入的几种方式
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型
- 【SSH进阶之路】Spring的IOC逐层深入——依赖注入的两种实现类型(四)
- Spring Ioc 之二 -依赖注入的几种方式
- Spring Ioc-依赖注入的几种方式
- Spring Ioc-依赖注入的几种方式
- Spring Ioc-依赖注入的几种方式
- Spring Ioc-依赖注入的几种方式
- Spring Ioc-依赖注入的几种方式
- Spring Ioc-依赖注入的几种方式
- SSH:通过注解(Annotation)的方式在Spring IoC容器中注入依赖
- Spring--初始化IOC容器的几种方式
- Java基础-常常碰到的问题
- Codeforces Round #364 (Div. 2) D. As Fast As Possible
- Android中shape的使用
- cocos2d-x中shader的使用
- android studio module无法删除
- 【SSH快速进阶】——Spring IOC容器注入的几种方式
- 称砝码--软件测试
- UVA 11827 Maximum GCD ungetc函数将ch字符重新退到输入流
- java读取文件及文件流
- bzoj4196(树链剖分)
- vim操作详解
- 【9906】装箱问题
- 缩小浏览器窗口延迟执行代码
- MySQL数据库学习笔记(四)----MySQL聚合函数、控制流程函数(含navicat软件的介绍)