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

本文共 5888 字,大约阅读时间需要 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();    }}

测试结果:

 

测试工程:

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

你可能感兴趣的文章
opengl 杂记
查看>>
兼容MIUI5和MIUI6的开启悬浮窗设置界面
查看>>
基于FPGA的DDS设计(一)
查看>>
.net 开发框架(一)[数据通用层]
查看>>
sql-ISNULL函数(转载)
查看>>
天启android5.1系统无法在非1650批次号的rk3288w芯片上启动
查看>>
C#.net书籍列表
查看>>
将IRepository接口进行抽象,使它成为数据基类的一个对象,这样每个子类都可以有自己的最基础的CURD了...
查看>>
IIS7.5 错误代码0x8007007e HTTP 错误 500.19 - Internal Server Error
查看>>
数论17——反演定理(二项式反演)
查看>>
第十八章 用于大型程序的工具
查看>>
ASP.NET 2.0学习笔记之Object Tag Syntax
查看>>
Redis 配置文件
查看>>
Jmeter Smock Test规范设计
查看>>
MurmurHash算法:高运算性能,低碰撞率的hash算法
查看>>
Download error: unknown url type: https
查看>>
vagrant虚拟机共享目录在windows宿主下的禁忌
查看>>
数据表操作类
查看>>
[v9] 列表页 调用 正文内容 或 自定义 字段(moreinfo的调用方法)
查看>>
php截取指定字符串之间的字符串的类
查看>>