博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring中基于AOP的@AspectJ
阅读量:6291 次
发布时间:2019-06-22

本文共 5931 字,大约阅读时间需要 19 分钟。

以下内容引用自:

@AspectJ是指将Java方法注解为Java 5注解的常规Java类的方式。通过在基于XML Schema的配置文件中包含以下元素来启用@AspectJ支持。

还需要使用以下AspectJ库:

   
org.aspectj
aspectjrt
1.8.10
org.aspectj
aspectjweaver
1.8.10

集成步骤:

1、声明一个aspect(方面)

Aspects类和其他任何正常的bean一样,除了它们将会用@AspectJ注解之外,它和其他类一样可能有方法和字段,如下所示:

package org.xyz;import org.aspectj.lang.annotation.Aspect;@Aspectpublic class AspectModule {}

它们将在XML中按照如下进行配置,就和其他任何bean一样:

2、声明一个pointcut(切入点)

切入点有助于确定要用不同建议执行的关联点(即方法)。在使用基于@AspectJ的配置时,切入点声明有两部分:

  • 一个切入点表达式,确定我们要用哪些方法执行。

  • 包括名称和任意数量的参数的切入点签名。该方法的实体是无关紧要的,其实应该是空的。

以下示例定义了一个名为“businessService”的切入点,它将匹配com.xyz.myapp.service包下的类中可用的每个方法的执行:

import org.aspectj.lang.annotation.Pointcut;@Pointcut("execution(* com.xyz.myapp.service.*.*(..))") // expression private void businessService() {}  // signature

以下示例定义了一个名为“getname”的切入点,该切入点将匹配在包com.tutorialspoint下的Student类中可用的getName()方法的执行:

import org.aspectj.lang.annotation.Pointcut;@Pointcut("execution(* com.tutorialspoint.Student.getName(..))") private void getname() {}

提示:

①类似:“execution(*com.tutorialspoint.Student.getName(..))”这样的语法叫做AspectJ切入点语法,参考:

②官方文档关于AspectJ的介绍:

3、声明建议(通知类型)

你可以使用代码片段中给出的@{ADVICE-NAME}注释声明建议五个中的任何一个。这假设你已经定义了一个切入点签名方法businessService():

@Before("businessService()")public void doBeforeTask(){   ...}@After("businessService()")public void doAfterTask(){   ...}@AfterReturning(pointcut="businessService()", returning="retVal")public void doAfterReturnningTask(Object retVal) {   // you can intercept retVal here.   ...}@AfterThrowing(pointcut="businessService()", throwing="ex")public void doAfterThrowingTask(Exception ex) {  // you can intercept thrown exception here.  ...}@Around("businessService()")public void doAroundTask(){   ...}

你可以为任何建议内联定义切入点。以下是在建议之前定义内联切入点的示例:

@Before("execution(* com.xyz.myapp.service.*.*(..))")public doBeforeTask(){   ...}

可以看出代码上的自由度还是非常高的,比如这个在XML中无法实现。

例子:

pom.xml:

4.0.0
com.jsoft.testspring
testaopaspectj
0.0.1-SNAPSHOT
jar
testaopaspectj
http://maven.apache.org
UTF-8
junit
junit
3.8.1
test
org.springframework
spring-core
4.1.4.RELEASE
org.springframework
spring-context
4.1.4.RELEASE
org.springframework
spring-aop
4.1.4.RELEASE
org.aspectj
aspectjrt
1.8.10
org.aspectj
aspectjweaver
1.8.10

Student.java:

package com.jsoft.testspring.testaopaspectj;public class Student {    private Integer age;    private String name;    public void setAge(Integer age) {        this.age = age;    }    public Integer getAge() {        System.out.println("Age : " + age);        return age;    }    public void setName(String name) {        this.name = name;    }    public String getName() {        System.out.println("Name : " + name);        return name;    }    public void printThrowException() {        System.out.println("Exception raised");        throw new IllegalArgumentException();    }}

Logging.java:

package com.jsoft.testspring.testaopaspectj;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;@Aspectpublic class Logging {       @Pointcut("execution(* com.jsoft.testspring..*.*(..))")       private void selectAll(){}       @Before("selectAll()")       public void beforeAdvice(){          System.out.println("Going to setup student profile.");       }       @After("selectAll()")       public void afterAdvice(){          System.out.println("Student profile has been setup.");       }       @AfterReturning(pointcut="selectAll()", returning="retVal")       public void afterReturningAdvice(Object retVal){          System.out.println("Returning:" + retVal.toString() );       }       @AfterThrowing(pointcut="selectAll()", throwing="ex")       public void AfterThrowingAdvice(IllegalArgumentException ex){          System.out.println("There has been an exception: " + ex.toString());          }  }

beans.xml:

这里定义looging的bean是用于实例化。

App.java:

package com.jsoft.testspring.testaopaspectj;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;/** * Hello world! * */public class App {    public static void main(String[] args) {        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");        Student student = (Student) context.getBean("student");        student.getName();        student.getAge();        student.printThrowException();    }}

测试结果:

 

测试工程:

==>如有问题,请联系我:easonjim#163.com,或者下方发表评论。<==

转载地址:http://kbuta.baihongyu.com/

你可能感兴趣的文章
小程序 · 跳转带参数写法,兼容url的出错
查看>>
flutter error
查看>>
Flask框架从入门到精通之模型数据库配置(十一)
查看>>
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>