Spring学习笔记
🐭⛅☔
AOP面向切面编程,动态代理,注解实现AOP,配置实现AOP…
AOP
简介
AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发效率。
面向切面编程:基于OOP基础之上新的编程思想;
在程序运行期间,将某段代码动态的切入到指定方法的指定位置进行运行的这种编程方式,就叫面向切面编程。
动态代理
一. 优缺点
- jdk默认的动态代理,如果目标对象没有实现任何接口,是无法为他创建对象的,手写麻烦;
- 可以使用动态代理将日志代码动态的在目标方法执行前后先执行。
二. 实现
1). 代理对象生成类
1 | package com.AAA.teng.proxy; |
2). 接口和方法
1 | public interface Calculator { |
1 | public class MyMathCalculator implements Calculator{ |
3). 工具类
1 | public class LogUtils { |
4). 测试类
1 | public static void main(String[] args) { |

Spring实现AOP
一. 原理:
Spring实现了AOP功能,底层就是动态代理,Spring简化了面向切面编程;
二. 优缺点
可以利用Spring简单的去创建动态代理,实现简单,而且没有强制要求目标对象必须实现接口;
1). AOP使用场景:
- AOP加日志保存到数据库;
- AOP做权限验证;
- AOP做权限检查
- AOP做事务控制;
三. AOP图解
1). 切入点表达式作用
通过表达式的方式定位一个或多个具体的连接点。
2). 通知:
- 在具体的连接点上要执行的操作。
- 一个切面可以包括一个或者多个通知。
- 通知所使用的注解的值往往是切入点表达式。
3). 指定切面的优先级:
- 在同一个连接点上应用不止一个切面时,除非明确指定,否则它们的优先级是不确定的。
- 切面的优先级可以通过实现Ordered接口或利用
@Order注解指定。 - 实现Ordered接口,getOrder()方法的返回值越小,优先级越高。

四. 实现
1). 导入jar包
AspectJ简介:
- AspectJ:Java社区里最完整最流行的AOP框架。
- 在Spring2.0以上版本中,可以使用基于AspectJ注解或基于XML配置的AOP。
- @AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面新版本Spring框架,建议使用AspectJ方式来开发AOP。

1 | //基础版 |
2). 配置文件
①. 通过注解形式 将对象增加到 ioc容器时,需要设置 扫描器<context:component-scan base-package="com.AAA.teng"></context:component-scan>;
②. 扫描器 会将 指定的包 中的 @Componet @Service @Respository @Controller修饰的类产生的对象 增加到IOC容器中;
③. @Aspect不需要 加入扫描器,只需要开启即可:<aop:aspectj-autoproxy></aop:aspectj-autoproxy>;
1 | <!-- |
3). 方法类
1 |
|
4). 工具类
①. 当在Spring IOC容器中初始化AspectJ切面之后,Spring IOC容器就会为那些与 AspectJ切面相匹配的bean创建代理。
②. AspectJ支持5种类型的通知注解:
[1]@Before:前置通知,在方法执行之前执行
[2]@After:后置通知,在方法执行之后执行
[3]@AfterRunning:返回通知,在方法返回结果之后执行
[4]@AfterThrowing:异常通知,在方法抛出异常之后执行
[5]@Around:环绕通知,围绕着方法执行
③. 在AspectJ注解中,切面只是一个带有@Aspect注解的Java类,它往往要包含很多通知。
1 | /** |
5). 测试类
1 | public class AOPTest { |

6). 环绕通知
环绕通知:
- 在目标方法的前后、异常发生时、最终等各个地方都可以进行的通知,最强大的一个通知,类似一个动态代理,可以影响目标方法;
- 可以获取目标方法的 全部控制权(目标方法是否执行、执行之前、执行之后、参数、返回值等);
- 在使用环绕通知时,目标方法的一切信息 都可以通过invocation参数获取到;
- 环绕通知 底层是通过拦截器实现的;
1 |
|
- 环绕通知优先于普通通知执行

7). 多切面运行
多切面运行时执行顺序:默认按首字母排序,可以使用@Order(int)改变执行顺序;
1 |
|

五. xml配置AOP
正常情况下,基于注解的声明要优先于基于XML的声明。通过AspectJ注解,切面可以与AspectJ兼容,而基于XML的配置则是Spring专有的。
1). 方法类
1 | public class LogUtils { |
2). 配置文件
xml配置切面类的默认执行顺序按书写顺序。
1 | <!-- 基于注解的AOP步骤: |
3). xml配置和注解的区别:
- 注解:快速方便,简洁好用;
- 配置:功能完善,便于修改;
重要的用配置,不重要的用注解。
- 本文作者:
腾飞
- 本文链接:
https://www.tengfei.eu.org/article/cfe91d8.html
- 版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!