Spring 框架的 AOP

Spring 框架的 AOP

Spring 框架的一个关键组件是面向切面的编程(AOP)框架。面向切面的编程需要把程序逻辑分解成不同的部分称为所谓的关注点。跨一个应用程序的多个点的功能被称为横切关注点,这些横切关注点在概念上独立于应用程序的业务逻辑。在软件开发过程中有各种各样的很好的切面的例子,如日志记录、审计、声明式事务、安全性和缓存等。

在 OOP 中,关键单元模块度是类,而在 AOP 中单元模块度是切面。依赖注入帮助你对应用程序对象相互解耦合,AOP 可以帮助你从它们所影响的对象中对横切关注点解耦。AOP 像是编程语言的触发物,如 Perl,.NET,Java 或者其他语言。

Spring AOP 模块提供拦截器来拦截一个应用程序,例如,当执行一个方法时,你可以在方法执行之前或之后添加额外的功能。

AOP 术语

在我们开始使用 AOP 工作之前,让我们熟悉一下 AOP 概念和术语。这些术语并不特定于 Spring,而是与 AOP 有关的。

描述
Aspect一个模块具有一组提供横切需求的 APIs。例如,一个日志模块为了记录日志将被 AOP 方面调用。应用程序可以拥有任意数量的方面,这取决于需求。
Joinpoint 在你的应用程序中它代表一个点,你可以在插件 AOP 方面。你也能说,它是在实际的应用程序中,其中一个操作将使用 Spring AOP 框架。
Advice这是实际行动之前或之后执行的方法。这是在程序执行期间通过 Spring AOP 框架实际被调用的代码。
Pointcut这是一组一个或多个连接点,通知应该被执行。你可以使用表达式或模式指定切入点正如我们将在 AOP 的例子中看到的。
Introduction引用允许你添加新方法或属性到现有的类中。
Target object被一个或者多个方面所通知的对象,这个对象永远是一个被代理对象。也称为被通知对象。
WeavingWeaving 把方面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象。这些可以在编译时,类加载时和运行时完成。

通知的类型

Spring 方面可以使用下面提到的五种通知工作:

通知描述
前置通知在一个方法执行之前,执行通知。
后置通知在一个方法执行之后,不考虑其结果,执行通知。
返回后通知在一个方法执行之后,只有在方法成功完成时,才能执行通知。
抛出异常后通知在一个方法执行之后,只有在方法退出抛出异常时,才能执行通知。
环绕通知在建议方法调用之前和之后,执行通知。

通过注解来完成:
(1) 首先先配置少量.xml文件 或者想实现完全注解直接创建一个Java文件实现

 <context:component-scan base-package="com.openlab.aop">  //扫描对象的配置

    </context:component-scan>
<apo:aspectj-autoproxy>  //生成代理对象的配置

</apo:aspectj-autoproxy>

(2) 创建想要被增强的方法

@Component  //创建对象的注解
public class aopDao {
    public void add(){
        System.out.println("add方法");
    }
}

(2) 创建增强方法

@Component //生成对象的注解
@Aspect  //生成代理对象的注解
public class aopDaoPol {
    @Pointcut(value = "execution(* com.openlab.aop.aopDao.add(..))")  //
    public void pointcut(){

    }
    @Before(value = "pointcut()")  //前置通知
    public void before(){
        System.out.println("before--------------");
    }
    @Around(value = "pointcut()") //环绕通知
    public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕之前**************");
        proceedingJoinPoint.proceed();
        System.out.println("环绕之后**************");
    }

    @After(value = "pointcut()")  //后置通知
    public void after(){
        System.out.println("after**************");
    }
    @AfterReturning(value = "pointcut()")
    public void afterReturning(){
        System.out.println("afterReturning+++++++++++++++++++++");
    }

    @AfterThrowing(value = "pointcut()")  //异常通知
    public void afterThrowing(){
        System.out.println("afterThrowing+++++++++++++++++++++");
    }

测试结果:

环绕之前**************
before--------------
add方法
afterReturning+++++++++++++++++++++
after**************
环绕之后**************
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值