控制反转(思想)
通过下面的例子我们能可以更好的去理解IoC:
先看下项目结构:
-
先写个dao接口:UserDao
public interface UserDao { void getUser(); }
-
在写个dao的实现类:UserDaoImpl
public class UserDaoImpl implements UserDao { @Override public void getUser() { System.out.println("默认获取用户数据!"); } }
-
写个Service接口:UserService
public interface UserService { void getUser(); }
-
再写个Service的实现类:UserServiceImpl
public class UserServiceImpl implements UserService { // 组合 private UserDao userDao = new UserDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
-
写个测试类:MyTest
public class MyTest { public static void main(String[] args) { // 用户实际调用的是业务层,dao层他们不需要接触 UserService userService = new UserServiceImpl(); userService.getUser(); } }
运行结果:
-
假如用户的需求变了,想通过Mysql获取用户数据
解决:
先在dao层添加个UserMysqlDaoImpl
public class UserMysqlDaoImpl implements UserDao { @Override public void getUser() { System.out.println("Mysql获取用户数据!"); } }
再修改下serviceImpl里面的方法
public class UserServiceImpl implements UserService { // 组合 private UserDao userDao = new UserMysqlDaoImpl(); @Override public void getUser() { userDao.getUser(); } }
再测试
要是用户需求再变,还得加dao实现类,还得换service里面的方法,要是代码量再大点,那真的是好麻烦啊啊
面对需求百变的用户,有没有别的解决方案啊!
-
天无绝人之路,再棘手的问题总有个解决办法
加个方法也许瞬间不一样了
试试在UserServiceImpl里面加个set方法
public class UserServiceImpl implements UserService { // 组合 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } @Override public void getUser() { userDao.getUser(); } }
假如用户的需求又变了,用户又想用Oracle获取数据
那来吧 So Easy!
先加个UserOracleDaoImpl类
public class UserOracleDaoImpl implements UserDao { @Override public void getUser() { System.out.println("Oracle获取用户数据!"); } }
再改个测试类:
public class MyTest { public static void main(String[] args) { // 用户实际调用的是业务层,dao层他们不需要接触 UserService userService = new UserServiceImpl(); ((UserServiceImpl) userService).setUserDao(new UserOracleDaoImpl()); userService.getUser(); } }
测试结果:
看出不一样没,service里面的东西不用变了
用户的需求要变的话,我们就只用在dao层增加一个实现类就行了,其他的都不需要变
真美啊,这下可省事儿了,哈哈哈哈
-
总结:
传统的程序,因为是new出来的对象,程序的主动权在程序猿手里
加个set方法以后,程序的主动权变到了用户手里
这就是著名的控制反转啊,Inversion of Control,也不过如此嘛哈哈哈