概念:
AOP——面向切面编程,通过预编译/动态代理实现程序功能的统一维护
主要功能是:日志、性能统计、安全控制、事务处理、异常处理
实现方式
- 预编译——AspectJ
- 动态代理——SpringAOP、JbossAOP
常用概念
- Advice通知的类型
Spring的AOP实现
- 纯Java实现,无需特殊编译,不需要控制类加载器
- 只支持方法执行连接点
- 目的是提供一种APO与SpringIOC之间的整合
- 与AspectJ相比,SpringAOP并不全面
有接口和无接口的SpringAOP的区别(没看懂)
- 有接口,默认使用标准JavaSErvice动态代理作为AOP代理
- 无接口使用CGLIB代理
配置、切面实现、切入点,切入方式
Demo:
首先需要增加依赖包
在Spring.xml中配置切面
切入点
切面实现
带参切入方法实现
测试类
带参切入点测试结果
Introductions引入
- 简介允许一个切面声明一个实现指定接口的通知对象,并且提供了一个接口实现来代表这些对象
- 由 aop:aspect 中的 aop:declare-parents 元素声明该元素用于声明所匹配的类型拥有一个新的parent
例如:有个Service提供server服务,想在不更改Service代码的前提下对该Service增加验证,即可以定义一个接口和实现,再通过Introductions为Service增加新的接口,使Service可以通过验证后再执行server
Demo:
声明一个接口,并提供实现
想要引入的类
配置
Test方法
执行结果
advisor
- 就像一个小的自包含的方面,只有一个advice
- 切面自身通过一个bean表示,并且必须实现某个advice接口,同事,advisor也可以很好的利用AspectJ的切入点表达式
- Spring通过配置文件中的aop:advisor 元素支持advisor 实际使用中大多数情况下他会和transactional advice配合使用
- 为了定义一个advisor的优先级以便让advice可以有序,可以使用order属性来定义advisor的顺序
例如:该标签只是切入的另一种方式,只需要配置切入点和实现了通知接口的类即可实现切面
Demo:
配置
实现了Advice接口的实现类
切入点测试调用方法
测试
结果