AOP面向切面编程

本文详细介绍了AOP(面向切面编程)的概念,包括其与OOP的关系,核心组件如代理目标、代理对象、连接点、切点和通知,以及如何在Spring框架中实现AOP,通过实例展示了如何使用AspectJ表达式语言指定切点,实现前置、后置、最终、抛出异常后和环绕通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AOP (Aspect Oriented Programming)

AOP (Aspect Oriented Programming)是OOP的延续,称为面向切面编程。AOP可以通过预编译的方式或者运行时动态代理实现在不需要修改原代码的情况下给程序动态添加额外功能的技术。

AOP 相关的概念:

  1. 代理目标 (target):谁将被其它对象代理,谁就是代理目标。
  2. 代理对象 (proxy):谁将代理其它对象,谁就是代理对象。
  3. 连接点 ( Join Point ) :加入点是程序中的任何点,例如方法执行,异常处理,字段访问等。
  4. 切点 ( Pointcut ) :它是一个匹配连接点的AOP表达式语言。即,用于限定满足一定条件的一组连接点join point,即要指定 执行点 和 方位信息。
  5. 通知(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 实现步骤:

  1. 在pom.xml中添加依赖 spring-aop,aspectjrt,aspectjweaver
    注: Spring AOP 的内部实现需要依赖于 AspectJ,AspectJ 是基于 JVM 的 支持 AOP 操作的一种语言。
  2. 添加bean
  3. 确定代理目标(谁将被代理) 确定代理目标(谁将被代理)
  4. 创建配置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有多种写法
"…"表示任何参数任何子包
"
"表示任何返回值、包、类、方法
在 包名中使用 … 表示 多层路径
在 () 之前中使用 * 表示 某个类中的所有方法
在 参数列表中使用 … 表示 任意多个参数 ( 可以是 零个、一个、多个)
在 参数列表中使用 * 表示 至少有一个参数 ( 可以是 一个 或 多个)

  1. 测试
    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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值