Spring-IOC
1. 拓展
现代化的Java开发,就是基于Spring的开发
- SpringBoot
- 快速开发的脚手架
- 基于SpringBoot可以快速开发微服务
- 约定大于配置
- SpringCloud
- SpringCloud是基于SpringBoot实现的
学习SpringBoot的前提是掌握Spring以及SpringMVC,SpringBoot起到承上启下 的作用;
弊端:配置十分繁琐,人称:“配置地狱”;
2. IOC理论推导
问题展示
对象包:(接口)
package com.kangzhu.dao;
public interface UserDao {
public void getUser();
}
对象包:(实现1)
package com.kangzhu.dao;
public class UserDaoImpl implements UserDao{
@Override
public void getUser() {
System.out.println("I am the user");
}
}
对象包:(实现2)
package com.kangzhu.dao;
public class UserDaoMysqlImpl implements UserDao{
@Override
public void getUser() {
System.out.println("I am the user found by Mysql");
}
}
服务包:(接口)
package com.kangzhu.service;
public interface UserService {
public void getUser();
}
服务包:(实现)
package com.kangzhu.service;
import com.kangzhu.dao.UserDao;
import com.kangzhu.dao.UserDaoImpl;
import com.kangzhu.dao.UserDaoMysqlImpl;
public class UserServiceImpl implements UserService{
// private UserDao userDao = new UserDaoImpl();
private UserDao userDao = new UserDaoMysqlImpl();
@Override
public void getUser() {
// 业务层调用dao层
userDao.getUser();
}
}
客户端(测试类)
import com.kangzhu.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
// 用户实际调用的是业务层
UserServiceImpl userService = new UserServiceImpl();
userService.getUser();
}
}
问题在哪呢?
客户端的需求可能会影响我们的代码,如果说客户端想要通过普通的方式查询用户,服务包:(实现)中需要引入对象包(实现1),如果客户端想要通过Mysql的方式查询用户,需要引入对象包(实现2);
需要根据客户端的需求修改源代码,如果代码量很大,修改一次的成本就会十分昂贵!
解决方法(set注入)
改变服务实现类
package com.kangzhu.service;
import com.kangzhu.dao.UserDao;
public class UserServiceImpl implements UserService{
private UserDao userDao = null;
// set注入
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void getUser() {
userDao.getUser();
}
}
客户端:
import com.kangzhu.dao.UserDaoMysqlImpl;
import com.kangzhu.service.UserServiceImpl;
public class MyTest {
public static void main(String[] args) {
// 用户实际调用的是业务层
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
- 之前,程序是主动对象,控制权在程序员手上;
- 使用了set注入后,程序不再具有主动性,而是变成了接收对象;
这种思想从本质上解决了问题,程序员不用再去管理对象的创建;系统的耦合性降低,程序员可以专注在业务实现上;
这就是IOC的原型!
IOC的本质:
- 控制反转,是一种设计思想;
- 所谓控制反转就是:获得依赖对象的方式反转了;