对sprig框架中控制反转(依赖注入)的理解

 

package zj.zgs.dao;
public interface UserDao {
	public void getUser();
}

package zj.zgs.dao.impl;
import zj.zgs.dao.UserDao;
public class UserDaoMySqlImpl implements UserDao {
	@Override
	public void getUser() {
		// TODO Auto-generated method stub
		System.out.println("MySql获取用户数据");
	}
}


package zj.zgs.dao.impl;
import zj.zgs.dao.UserDao;
public class UserDaoOracleImpl implements UserDao {
	@Override
	public void getUser() {
		// TODO Auto-generated method stub
		System.out.println("Oracle获取用户数据");
	}

}


package zj.zgs.service;
public interface UserService {
	public void getUser();
}


package zj.zgs.service.impl;
import zj.zgs.dao.UserDao;
import zj.zgs.service.UserService;

public class UserServiceImpl implements UserService{
//	private UserDao userDao = new UserDaoMySqlImpl();   
//  之前是上面这种做法,由调用者(UserServiceImpl类的实例)创建被调用者
(UserDaoMySqlImpl类的实例),但是这样就存在一个问题,之前我们获取的是
MySql的数据,现在我们增加了一个Oracle的数据库,这样就需要程序能够获取
Oracle类型的数据,为了获取Oracle数据就学要修改之前写的代码,将所有
UserDaoMySqlImpl改为UserDaoOracleImpl,这样维护起来工作量太大,而且
繁琐。

//后来我们就使用下面这种方式,先不关心依赖类的创建,并给调用者提供一个
set方法,用来设置被调用者的类型,这样就将被调用者的创建解耦,被调用者的
类型完全取决于外部的注入。
	private UserDao userDao = null;
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	@Override
	public void getUser() {
		// TODO Auto-generated method stub
		userDao.getUser();		
	}
}


package zj.zgs.test;
import zj.zgs.dao.impl.UserDaoMySqlImpl;
import zj.zgs.dao.impl.UserDaoOracleImpl;
import zj.zgs.service.impl.UserServiceImpl;
public class Test {
	public static void main(String[] args) {
		UserServiceImpl userService = new UserServiceImpl();
		userService.setUserDao(new UserDaoMySqlImpl());
		userService.getUser();
		System.out.println("================================");
		userService.setUserDao(new UserDaoOracleImpl());
		userService.getUser();
	}
}

 

 

 

 

 

 

通过上面的案例:

被调用者由原来调用者程序本身创建,变为了程序接收外部的注入。

程序员主要精力集中在于业务实现,而不用关注类创建这复杂的过程。

实现了service和dao的解耦工作。Service层和dao层实现了分离。没有直接依赖关

系。

       如果dao的实现发生改变,应用程序本身不需要改变。

依赖注入可以用下面这个例子进行理解。一个人(Java实例,调用者)需要一把斧子(Java实例,被调用者)。

在很久之前,没有做斧子的工厂,商店也没有斧子卖,如果你需要一把斧子,就得自己去打造一把斧子。

后来慢慢发展,有生产斧子的工厂,商店就有斧子卖,如果你现在需要一把斧子,只需要到商店,让导

购员给你一把斧子就OK。而你不用去关心斧子的创建过程,可以把所有的精力放在砍柴上。

 

哈哈,我是这么理解的,可能说的有些牵强,但是大概意思应该是可以理解的。希望对需要的人有所帮助。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值