Spring是一款开源的轻量级Java开发框架,可以解决企业应用开发的复杂性,旨在提高开发人员的开发效率以及系统的可维护性。 我们一般说的Spring框架指的都是Spring Framework,它是很多模块的集合,使用这些模块可以很方便地协助我们开发,比如说Spring支持Ioc和AOP、可以很方便地对数据库进行访问(Spring对JDBC进行封装,使用JDBCTemple方便对数据库操作)、可以很方便地集成第三方组件、对单元测试的支持等。
Spring提供的两个核心功能:IoC和AOP。
Spring IoC
IoC:Inversion of Control 即控制反转。
控制:指的是对象创建(实例化、管理)的权力。
反转:控制权交给外部环境(Spring框架、IoC容器)
Ioc的思想就是将原本在程序中手动创建对象的控制权交给Ioc容器来管理。 把对象之间的依赖交给IoC容器进行管理,并由IoC容器完成对象的注入,IoC 容器是 Spring 用来实现 IoC 的载体,IoC容器就像是一个对象工厂一样,当我们需要创建一个对象的时候,只要配置好配置文件/注解即可,完全不用考虑对象是如何被创建出来的。这样可以大大简化应用的开发,把应用从复杂的依赖关系中解放出来,同时降低代码的耦合度。
在一个实际项目中,Service类可能依赖了很多其它的类,假如我们要实例化这个Service,你可能要每次都搞清这个Service所有底层类的构造函数,这十分的不方便,但是我们如果利用IoC的话,我们只需配置好,然后在需要用到的地方引用就行了。
IoC操作:Bean管理
Bean管理:由Spring创建对象和注入属性 Bean代指的就是那些被IoC容器所管理的对象,我们可以通过XML文件和注解+配置类来告诉IoC容器帮助我们管理哪些对象。
Spring AOP
AOP:Aspect Oriemted Programming 即面向切面编程。
AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理和控制权限等)封装起来,减少系统的重复代码,降低模块间的耦合度,同时有利于未来的可拓展性和可维护性。
AOP底层使用动态代理,有两种情况:
- 如果要代理的对象实现了某个接口,那么Spring AOP会使用JDK Proxy去创建代理对象
2.而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候 Spring AOP 会使用 Cglib 生成一个被代理对象的子类来作为代理。
通过创建子类的代理对象增强方法的功能
AOP相关术语:
| 术语 | 含义 |
|---|---|
| 连接点 | 类中哪些方法可以被增强 |
| 切入点 | 真正被增强的方法 |
| 通知(增强) | 实际增强的逻辑部分称为通知 |
| 切面 | 把通知应用到切入点的过程 |
附其它版本:
| 术语 | 含义 |
|---|---|
| 目标(Target) | 被通知的对象 |
| 代理(Peoxy) | 将目标对象应用通知之后创建的代理对象 |
| 连接点(JoinPoint) | 目标对象的所属类中,定义的所有方法均为连接点 |
| 切入点(Piontcut) | 被切面拦截/增强的连接点(切入点一定是连接点,连接点不一定是切入点) |
| 通知(Advice) | 增强的逻辑/代码,也即拦截到目标对象的连接点之后要做的事情 |
| 切面(Aspect) | 切入点+通知 |
| 织入(Weaving) | 将通知应用到目标对象,进而生成代理对象的过程动作 |
AOP操作:
Spring框架一般基于AspectJ实现AOP操作,其也有xml文件配置和注解+配置类两种方式 什么是AspectJ:AspectJ不是Spring组成部分,独立AOP框架,一般把AspectJ和Spring框架一起用,进行AOP操作。
Spring AOP 和 AspectJ AOP 的区别:Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。 Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。 Spring AOP 已经集成了 AspectJ ,AspectJ 应该算的上是 Java 生态系统中最完整的 AOP 框架了。AspectJ 相比于 Spring AOP 功能更加强大,但是 Spring AOP 相对来说更简单, 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比 Spring AOP 快很多。
AspectJ 定义的通知类型:
-
Before(前置通知):目标对象的方法调用之前触发
-
After (后置通知):目标对象的方法调用之后触发
-
AfterReturning(返回通知):目标对象的方法调用完成,在返回结果值之后触发
-
AfterThrowing(异常通知) :目标对象的方法运行中抛出 / 触发异常后触发。AfterReturning 和 AfterThrowing 两者互斥。如果方法调用成功无异常,则会有返回值;如果方法抛出了异常,则不会有返回值。
-
Around: (环绕通知)编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法
多个切面的执行顺序我们通过@order注解直接定义切面顺序
参考:Spring总结 (javaguide.cn)以及自己的学习笔记