《Spring实战》——4

本文深入探讨了面向切面编程(AOP)的概念,包括其作用、术语解释及应用实例。AOP通过分离关注点,简化了如日志、安全和事务管理等功能的实现。文章详细介绍了通知、连接点、切点、切面、引入和织入等关键术语,并提供了切点和引入的具体代码示例。

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

面向切面编程AOP

AOP的作用是分离掉实现对象方法时不需要关注的功能,或者在无法修改源码的情况下,给对象增加功能。例如日志、安全和事务管理功能在软件中很重要,但是在编写程序时主动将这些功能加入对象中又十分麻烦,就可以利用AOP简化难度了。

 

AOP术语

通知(Advice)定义了切面必须完成的工作和什么时候完成。根据完成的时机,分为五种:Before, After, After-returning, After-throwing, Around。简答理解这些通知时机,before即在执行切面前,after在执行切面后。那after-returning和after有什么区别?如果关心切面返回的结果,使用前者,如果只是简单的定义一下执行完后需要做的工作,使用后者。After-throwing定义抛出错误后需要执行的工作。Around称为环绕,一开始不能理解它与同时使用before和after的区别,后来了解到,对于before和after,不方便进行消息传递和信息共享,如果涉及到消息传递的情况,则around是一个不错的选择。对于@Around注解,需要在通知方法中注入ProceedingJoinPoint对象,这样调用jp.proceed()可以调用被通知的方法,从而决定被通知的方法到底何时调用。

连接点(join point)定义了应用通知的时机。举个简单的例子,通知x需要在对象n的f功能执行前调用,那么这个f就是连接点。

切点(pointcut)定义会匹配通知所要织入的一个或多个连接点。简单来说切点用于缩小切面所统治的连接点的范围。

切面(aspect)是通知和切点的结合,在何时何处完成何种工作。

引入(introduction)表示向已有的类中添加新的方法或属性。通常使用代理实现。

织入(weaving)表示把切面应用到目标对象并创建新的代理对象的过程。

 

切点的例子

以《Spring实战》中音乐会为例子。

@Aspect
public class Audience {

    @Before(“execution(** concert.Performance.perform(..))”)
    public void foo() {

        //do something

    }
}

其中@Aspect注解定义了切面应用于Audience对象上,@Before标注表示通知应用在perform调用之前,其中的语句进行解析,**表示不论方法返回的值,concert.Performance.perform定义了具体的方法,..表示不论方法传入的参数。定义在通知中的语句,还可以进行与&&,或||,非!等操作。通过对该语句的解析,可以得到推论,即使用不同方法签名确定某个特定的方法。

当然,如果对perform调用的之前之后都有定义通知,可以使用

@Pointcut(“execution(** concert.Performance.perform(..)”)
public void performance() {}

来定义切点简化操作。即传入通知注解的语句可以简化为”performance()”。

 

引入的例子

@Aspect
public class EncoreableIntroducer {

    @DeclareParents(value=“concert.Performance+”, defaultImpl=DefaultEncoreable.class)
    public static Encoreable encoreable;

}

value指定了哪种类型的bean需要引入该接口,+表示该类型的子类。

defaultImpl指定了引入接口提供实现的类。

标注的静态Encoreable表示要引入的接口为Encoreable。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值