Spring学习之AOP总结帖vnsc5858威尼斯城官网

时间:2019-10-05 23:08来源:计算机教程
Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探,aspectjaop 由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现。 本文一下未贴出的相关代码示例请关注小编

Spring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探,aspectjaop

由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现。

本文一下未贴出的相关代码示例请关注小编的上篇博文《Spring学习之旅(七)基于XML配置与基于AspectJ注解配置的AOP编程比较》,在此不再赘述。

基于AspectJ注解配置的AOP编程,就是将所有配置信息都放在源代码中以注解的方式标注。以与“基于XML配置”的AOP编程相区别。

1)Spring AOP注解就是依赖AspectJ来实现。因此使用Spring AOP注解,必须引入Aspectj框架及相应的包(aspectjrt.jar和aspectjweaver.jar)。

关于包的下载与引入,请参考小编的另外一篇博文《Spring学习之旅(五)极速创建Spring AOP java工程项目》

所以“基于AspectJ注解配置的AOP编程”实际上是:Spring AOP AspectJ框架进行切面编程。

2)创建Spring配置文件,并在配置文件中引入aop命名空间和context命名空间,并配置“AspectJ的注解支持”,以及自动扫描的包的支持。

3)基于AspectJ注解声明切面

即在设计切面类时,在java源代码中采用注解标注“切面的相关信息”。

讲一个java类声明为一个切面:

首先,要注解成一个Bean,必须是IoC的Bean,可以是用@Component注解定义Bean。

其次,注解声明为一个切面,使用@Aspect注解,同时在类的方法注解中给出与该切面相关的“通知”和“切入点”

然后,我们还可以指定切面的优先级,使用@Order(级别号)。级别号为大于等于0的整数,值越小,优先级越高。

4)基于AspectJ注解声明通知

标注在切面类的方法上,AspectJ支持5种类型的通知注解:

@Before、@After、@AfterRunning、@AfterThrowing、@Around

vnsc5858威尼斯城官网,举一个例子:

    //注解为前置通知,并注解其切入点表达式
    @Before("execution(* com.edu.aop.ArithmeticCalculator.*(..))")
    public void validationArgs(JoinPoint joinPoint){
        //具体方法实现  
}    

在上篇博文中的实例中,给出了通知内切入点表达式的两种写法:一种具体确定的;一种泛化的。

当通知括号内除了切入点表达式属性外,还有其他属性时,应写明属性对应的属性值。

比如:

@AfterRunning(pointcut="execution(* com.edu.aop.*.*(..))",returning="abc")
    public void afterMethod(JoinPoint joinPoint,Object abc){
        //具体方法实现
    }


@AfterThrowing(pointcut="execution(* com.edu.aop.*.*(..))",throwing="e")
    public void afterMethod(JoinPoint joinPoint,ArithmeticException e){
        //具体方法实现
    }

 

http://www.bkjia.com/Javabc/1307475.htmlwww.bkjia.comtruehttp://www.bkjia.com/Javabc/1307475.htmlTechArticleSpring学习之旅(八)Spring 基于AspectJ注解配置的AOP编程工作原理初探,aspectjaop 由小编的上篇博文可以一窥基于AspectJ注解配置的AOP编程实现...

  AOP(面向方面编程),也可称为面向切面编程,是一种编程范式,提供从另一个角度来考虑程序结构从而完善面向对象编程(OOP)。

  在进行 OOP 开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP 最大问题就是无法解耦组件进行开发,比如我们上边举例,而 AOP 就是为了克服这个问题而出现的,它来进行这种耦合的分离。AOP 为开发者提供一种进行横切关注点(比如日志关注点)分离并织入的机制,把横切关注点分离,然后通过某种技术织入到系统中,从而无耦合的完成了我们的功能。

1 AOP概述

  AOP(Aspect-Oriented Programming, 面向切面编程): 是一种新的方法论, 是对传统 OOP(Object-Oriented Programming, 面向对象编程) 的补充。AOP 的主要编程对象是切面(aspect), 而切面模块化横切关注点。在应用 AOP 编程时, 仍然需要定义公共功能, 但可以明确的定义这个功能在哪里, 以什么方式应用, 并且不必修改受影响的类. 这样一来横切关注点就被模块化到特殊的对象(切面)里。AOP更多概念

AOP 的好处:

  • 每个事物逻辑位于一个位置, 代码不分散, 便于维护和升级
  • 业务模块更简洁, 只包含核心业务代码

2 Spring AOP

  在 Spring2.0 以上版本中,可以使用基于 AspectJ 注解或基于 XML 配置的 AOP,AspectJava是Java社区中最完整最流程的AOP框架。

2.1 在Spring中使用AspectJava注解支持

  要在 Spring 应用中使用 AspectJ 注解, 必须在 classpath 下包含 AspectJ 类库: aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar。然后将 aop Schema 添加到 <beans> 根元素中。在 Spring IOC 容器中启用 AspectJ 注解支持,只要在 Bean 配置文件中定义一个空的 XML 元素 <aop:aspectj-autoproxy>即可,当 Spring IOC 容器侦测到 Bean 配置文件中的 <aop:aspectj-autoproxy> 元素时, 会自动为与 AspectJ 切面匹配的 Bean 创建代理。

  在AspectJ注解中,切面只是一个带有@Aspect注解的Java类,通知是标注有某种注解的简单Java方法,AspectJ支持以下5种类型的通知注解:

  • @Before: 前置通知, 在方法执行之前执行
  • @After: 后置通知, 在方法执行之后执行
  • @AfterRunning: 返回通知, 在方法返回结果之后执行
  • @AfterThrowing: 异常通知, 在方法抛出异常之后
  • @Around: 环绕通知, 围绕着方法执行

2.2 利用方法签名编写 AspectJ 切入点表达式

  最典型的切入点表达式时根据方法的签名来匹配各种方法:

  • execution(public void com.aop.HelloImpl.hi()):匹配HelloImpl中返回值为void且无参数的hi方法
  • execution(public void com.aop.HelloImpl.*()):匹配HelloImpl中返回值为void且无参数的所有public方法
  • execution(public void com.aop.HelloImpl.*(..)):匹配HelloImpl中返回值为void的所有public方法
  • execution(public * com.aop.HelloImpl.*(..)):匹配HelloImpl中所有public方法

  在AspectJ中,切入点表达式可以使用操作符&&、||、!结合起来。

// 声明该方法为前置通知
@Before("execution(public void com.aop.HelloImpl.hi()) || execution(public void com.aop.HelloImpl.hihi(String))")
public void beforeMethod(JoinPoint point) {
    String methodName = point.getSignature().getName();
    System.out.println("HelloAspect beforeMethod : "   methodName);
}

编辑:计算机教程 本文来源:Spring学习之AOP总结帖vnsc5858威尼斯城官网

关键词: