【SSH快速进阶】——Spring IOC容器注入的几种方式


  **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容器注入的几种方式》

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值