Spring原理是Java面试经常问到的内容,比如:IOC、AOP等,下面我就来详解核心的Spring原理@mikechen
Spring框架
Spring框架,包含:Spring IOC、Spring AOP等模块,如下图所示:
Spring原理
Spring框架的核心原理是:控制反转(IoC)和依赖注入(DI),以及Spring AOP、Spring事务等原理。
Spring IOC原理
Spring IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”,它是Spring框架的核心。
Spring IOC用于管理Java对象之间的依赖关系,将对象的创建、组装、管理交给框架来完成,而不是由开发者手动完成。
IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。
传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,如下图所示:
上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器。
所以,IOC借助于“第三方”实现具有依赖关系的对象之间的解耦,使程序更优良。
Spring IOC的实现原理,如下图所示:
IOC容器和对象的创建过程如下:
- 定义Bean:在配置文件或者类上使用注解定义Bean,例如@Component、@Service等。
- 实例化Bean:当应用程序需要使用Bean时,Spring容器会检查是否已经实例化该Bean,如果没有,则根据配置信息实例化该Bean。
- 组装Bean:Spring容器会检查该Bean是否有依赖关系,如果有,则将依赖的其他Bean注入到该Bean中。
- 提供Bean:Spring容器将实例化的Bean提供给应用程序使用。
Spring依赖注入原理
依赖注入(Dependency Injection,DI)是Spring框架的一个核心特性,它通过配置或者注解的方式,将一个对象依赖的其他对象注入进来。
如下图所示:
通过上图可以看出:依赖注入是实现控制反转(Inversion of Control,IoC)的一种具体实现方式。
在Spring中,实现依赖注入通常有三种方式:
1.构造函数注入(Constructor Injection):通过对象的构造函数来注入依赖对象。
public class UserServiceImpl implements UserService { private UserDao userDao; public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } //... }
2.属性注入(Property Injection):通过对象的Setter方法来注入依赖对象。
public class UserServiceImpl implements UserService { private UserDao userDao; public UserServiceImpl(UserDao userDao) { this.userDao = userDao; } //... }
3.接口注入(Interface Injection):通过对象实现的接口来注入依赖对象。
Spring AOP原理
Spring AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程的一种补充。
面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
Spring AOP 实现 AOP 采用的是动态代理的方式,通过代理对象实现对目标对象的方法进行拦截,从而达到切面的效果。
在 Spring AOP 中,代理对象主要有两种类型:
JDK 动态代理:基于接口的代理实现,通过实现 JDK 的 InvocationHandler 接口来定义拦截器,并使用 Proxy 类生成代理对象。
CGLIB动态代理:基于类的代理实现,通过继承目标对象来实现代理,不需要目标对象实现任何接口。
Spring AOP的应用场景,例如:日志记录、性能监控、事务管理、权限验证等。
spring事务原理
Spring事务管理有两种方式:编程式事务管理、声明式事务管理。
在 Spring 中,声明式事务是通过 AOP 技术实现的,当 Spring 容器加载时,它会为每个带有 @Transactional 注解的方法创建一个动态代理对象。
如下所示:
@Transaction public void insert(String userName){ this.jdbcTemplate.update("insert into t_user (name) values (?)", userName); }
Spring事务的本质其实就是Spring AOP和数据库事务,Spring 将数据库的事务操作提取为 切面,通过AOP在方法执行前后增加数据库事务操作。
以上就是Spring原理详解,更多Spring内容请查看:Spring教程(史上最全图文详解)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》