Spring makes programming Java quicker, easier, and safer for everybody.
以上这句话引用自Spring官网,用于回答问题”Why Spring?”, Spring提高编程效率的一个主要原因就是IOC(Inversion of Control),那么在了解IOC之前需要先了解传统的三层架构。
使用IOC之前
根据我目前的理解,三层架构即为dao层,service层,controller层。在此举个例子介绍。
Dao
接口UserDao:1
2
3public interface UserDao {
void getUser(); // 获取用户的方法,待实现
}
实现类UserDaoImpl:1
2
3
4
5public class UserDaoImpl implements UserDao {
public void getUser() {
System.out.println("获取用户信息");
}
}
实现类UserDaoMysqlImpl:1
2
3
4
5public class UserDaoMysqlImpl implements UserDao{
public void getUser() {
System.out.println("Mysql获取用户信息");
}
}
以此类推可以有很多种实现的方式。
Service
因为目前对service层的理解不够深,所以关于Service层的作用,网上搜集到以下说法:
- 粗略的理解就是对一个或多个DAO进行的再次封装,封装成一个服务
- dao层用与和底层的数据库打交道,因此只要是不和数据库打交道的都放在service层
接口类UserService:1
2
3public interface UserService {
void getUser();
}
实现类UserServiceImpl:1
2
3
4
5
6public class UserServiceImpl implements UserService {
UserDao userDao = new UserDaoMysqlImpl();
public void getUser() {
userDao.getUser();
}
}
测试
本来应该是Controller类的,但是这里暂时用测试类。
MyTest:1
2
3
4
5
6public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService=new UserServiceImpl();
userService.getUser();
}
}
输出:1
Mysql获取用户信息
分析
以上方法应该是最初级三层架构的方法:流程大概是用户只需要调用服务层中的类,服务层再去调用底层的dao。
假设现在需要添加需求:Oracle获取用户信息。我需要做以下操作:1. Dao层添加新的实现UserDaoOracleImpl; 2.Service层实现类中创建的实体要改成 new UserOracleImpl()以调用Dao层的Oracle实现;
在此方法中创建对象的控制权在Service层中。
控制反转
Dao层不变,Service层中加入Set方法
Service
实现类ServiceImpl:1
2
3
4
5
6
7
8
9
10
11public class UserServiceImpl implements UserService {
UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void getUser() {
userDao.getUser();
}
}
测试
MyTest:1
2
3
4
5
6
7public class MyTest {
public static void main(String[] args) {
UserServiceImpl userService = new UserServiceImpl();
userService.setUserDao(new UserDaoMysqlImpl());
userService.getUser();
}
}
输出:1
Mysql获取用户信息
分析
三层架构的调用顺序不变,但是在service层中引入set方法,那么将具体使用哪一个dao的实现类的控制权交付到了用户端。在IOC之前,这个控制权相当于写死在Service层中,我们希望尽可能少地更改底层的代码,使用IOC后,我们只需要在MyTest中通过改变setUserDao的参数即可改变实现的方法。
IOC本质
控制反转IOC本质是一种设计思想,依赖注入DI是一种实现的方法,没有IOC的程序中,我们使用面向对象编程,对象的创建与对象之间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方。
在Spring中实现控制反转的IOC容器,其实现方式是依赖注入。