约定编程
- 按照一定规则,将代码织入到约定的流程中。
Aop的本质是约定
- 横切关注点:影响应用多处的功能(安全、事务、日志)
- 横切关注点被模块化为特殊的类,这些类称为切面
切面作用:
- 将多个类的通用行为封装成可重用的模块
当调用 proxy 的getProxyBean (测试代码)方法时, 其执行流程如下
- ( l )先执行拦截器的 before 方法。
- (2)useAround 返回 true,则执行 around ,而本身方法
- ( 3 )无论怎样, 执行 after 方法。
- (4)发生异常, 执行afterThrowing 方法, 否则执行 afterReturning 方法。
代理:
- 增强或者控制对目标对象访问
Proxy 的newProxyInstance
- 类加载器:
- 接口,
- 逻辑实现。
invocationHandler ,定义 invoke 方法,实现代理对象的逻辑的
AOP(@AspectJ 方式)
aop的作用或实质:
- 约定编程:将代码织入约定的流程。
aop的实现:@Transactional注解
- 实现了数据库资源的打开和关闭、 事务的回漆和提交
AOP 术语和流程
- 基于方法,只能使用在方法上
- 连接点: 被拦截的对象(点), Spring是方法。(如方法前后或异常)
- 切点(切入点):一个或一组连接点,定义条件匹配连接点。(通知执行的位置。)
- 通知: 特定的连接点执行的动作。(定义了何时使用)。
- 目标(目标对象):被通知的对象,真正的业务逻辑
- 织入 :切面应用到目标对象创建代理对象的过程
- 织入 实现:通过动态代理生成代理对象,将切点定义匹配的连接点拦截,代码织入约定流程的过程。
- 织入 可以在编译时,加载时,运行时完成。 spring是运行
- 切面(aspect):通知和切入点的结合
- 引入: 向现有类中添加方法或属性
- 代理(proxy):通知目标对象后创建的对象
AOP 开发详解
- 实现目标对象方法。
- @Aspect 注解定义切面
- @Before注解定义通知
- @Pointcut注解定义切点,描述哪些类的哪些方法需要启用 AOP 编程
- 切点标注在方法 ,在后面的通知注解中 就可以使用方法名称来定义
Spring Boot 的配置启动文件
- 指定扫描包:@SpringBootApplication(scanBasePackages = { ” com.springboot.chapter4 . aspect" })
- 定义切面 @Bean(name=” myAspect” )
正则式定义什么时候启用 AOP
execution(* com.springboot.chapter4 aspect.service . 工mpl.UserServiceimpl . printUser ( . ) )
- • execution :执行时候,拦截正则匹配的方法:
- * :任意返回类型
- com.springboot.chapter4.aspect.seice.impl. UserServicelmpl :指定对象的全限定名称
- printUser :指定方法
- (.):任意参数。。
AspectJ 的指示器
- @args() 限制参数(包含子类) ,接受注解类
- @target() 限制目标对象类型(包含子类) ,接受注解类
- @within() 限定指定类型 ,,接受注解类
- args() 限制参数(包含子类)
- target() 限制目标对象类型(包含子类)
- within() 限定指定类型
- @annotation() 限定注解
通知:
- @Before,前置通知 :连接点前执行,。
- @After 后置通知:连接点后执行,不管是否正常执行
- @AfterReturning 正常返回通知 :连接点正常执行后执行,
- @AfterThrowing 异常返回通知 :连接点抛出异常后执行。
- @Around 环绕通知 :取代原有方法,提供回调原有方法能力(一般实现包裹被通知的方法,调用前后执行自定义的行为)
ProceedingJoinPoint
- Around提供 ProceedingJoinPoint 参数,ProceedingJoinPoint 有 proceed回调原有方法
引入:引入类的属性或方法(作用:引入类增强服务)
- 实现引入类方法(或其他包)
- @DeclareParents 注解定义引入,
- value:增强功能的目标对象。 (目标)
- •defaultlmpl: 引入增强功能的类,
通知获取参数
- 使用args来绑定目标方法的参数
- 非环绕通知使用 JoinPoint类型的参数获取参数
- 环绕通知使用 ProceedingJoinPoint 类型获取参数
- getArgs 获取信息
织入:切面应用到目标对象创建代理对象的过程
代理:
- 使用 AOP 的类拥有接口时, 它会以 JDK 动态代理运行,否则以 CGLIB 运行。
多个切面:
- 配置启动文件定义多个@bean
- 实现Ordered 接口定义切面顺序,实现getOrder 方法。