AOP (Aspect Oriented Programming)
AOP (Aspect Oriented Programming)是OOP的延续,称为面向切面编程。AOP可以通过预编译的方式或者运行时动态代理实现在不需要修改原代码的情况下给程序动态添加额外功能的技术。
AOP 相关的概念:
- 代理目标 (target):谁将被其它对象代理,谁就是代理目标。
- 代理对象 (proxy):谁将代理其它对象,谁就是代理对象。
- 连接点 ( Join Point ) :加入点是程序中的任何点,例如方法执行,异常处理,字段访问等。
- 切点 ( Pointcut ) :它是一个匹配连接点的AOP表达式语言。即,用于限定满足一定条件的一组连接点join point,即要指定 执行点 和 方位信息。
- 通知(Advice) :就是切入点上调用的方法,Adviced 类型决定了调用Advice方法的时机。
Advice类型:
5.1前置Advice : 目标方法调用前执行的Advice,该Advice无法阻止对目标方法是调用。使用@Before 或<aop:before>实现。
5.2后置Advoce : 在目标方法返回值后执行的通知,不包括抛出异常的情况。使用@AfterReturning或<aop:after-returning>实现。
5.3最终Advice : 目标方法调用结束后执行的通知(不论是正常退出还是异常退出)。使用@After或<aop:after>实现。
5.4抛出异常后Advice : 在方法抛出异常退出时执行的通知。使用@AfterThrowing或<aop:after-throwing>实现。
5.5环绕Advice : 包围目标方法,可以在目标方法后完成自定义行为,可以阻止对目标方法的调用。使用@Around或<aop:round>实现。
AOP 实现步骤:
- 在pom.xml中添加依赖 spring-aop,aspectjrt,aspectjweaver
注: Spring AOP 的内部实现需要依赖于 AspectJ,AspectJ 是基于 JVM 的 支持 AOP 操作的一种语言。 - 添加bean
- 确定代理目标(谁将被代理) 确定代理目标(谁将被代理)
- 创建配置Spring文件
<aop:config>
<aop:aspect ref=“advices”>
通过 aop:pointcut 标签的 expression 来指定切点表达式
<aop:pointcut id=“firstPointcut” expression="execution(* com.itlaobing.aop.schema.Tortoise.())" />
前置Advice
<aop:before pointcut-ref=“firstPointcut” method=“abc” />
后置Advoce
<aop:after pointcut-ref=“firstPointcut” method=“xyz” />
</aop:aspect>
</aop:config>
切入点是用AspectJ表达式表示的,AspectJ中execution()是固定写法。在()内描述切入点的位置。AspectJ有多种写法
"…"表示任何参数任何子包
""表示任何返回值、包、类、方法
在 包名中使用 … 表示 多层路径
在 () 之前中使用 * 表示 某个类中的所有方法
在 参数列表中使用 … 表示 任意多个参数 ( 可以是 零个、一个、多个)
在 参数列表中使用 * 表示 至少有一个参数 ( 可以是 一个 或 多个)
- 测试
String configLocations = “classpath*:com/**/schema/aop-schema.xml” ;
AbstractApplicationContext container = new ClassPathXmlApplicationContext( configLocations );
Object proxy = container.getBean( “tortoise” );
System.out.println( proxy.toString() );
if( proxy instanceof Swimmable ) {
Swimmable s = (Swimmable) proxy ;
s.swim();
}