是一种建议类型,可确保方法执行前后的通知可以运行。 以下是通知的语法:
语法
@Pointcut("execution(* com.yiibai.Student.getAge(..))") private void selectGetName(){} @Around("selectGetAge()") public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ System.out.println("[aroundAdvice] Around advice"); Object[] args=jp.getArgs(); if(args.length>0){ System.out.print("[aroundAdvice] Arguments passed: " ); for (int i = 0; i < args.length; i++) { System.out.print("[aroundAdvice] arg "+(i+1)+": "+args[i]); } } Object result=jp.proceed(args); System.out.println("[aroundAdvice] Returning " + result); return result.toString(); }
在上面的语法示例中 –
– 将函数标记为切入点
execution( expression ) – 涵盖应用通知的方法的表达式。
– 将函数标记为在切入点覆盖的方法之前执行的通知。
要了解上面提到的通知相关的概念,我们写一个Spring AOP基于注解的应用例子,它将使用基于注解配置实现通知。打开并使用Eclipse IDE,并按照以下步骤创建一个Spring应用程序:
更新在中创建过的Student项目。
更新bean配置并运行应用程序,如下所述。
整个项目的目录结构如下所示 –
下面是Logging.java文件的内容。 这实际上是一个Aspect模块的样本,它定义了在各个点被调用的方法。
package com.yiibai; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.ProceedingJoinPoint; @Aspect public class Logging { /** Following is the definition for a pointcut to select * all the methods available. So advice will be called * for all the methods. */ @Pointcut("execution(* com.yiibai.Student.getAge(..))") private void selectGetAge(){} /** * This is the method which I would like to execute * around a selected method execution. */ @Around("selectGetAge()") public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("Around advice"); Object[] args=proceedingJoinPoint.getArgs(); if(args.length>0){ System.out.print("Arguments passed: " ); for (int i = 0; i < args.length; i++) { System.out.print("arg "+(i+1)+": "+args[i]); } } Object result=proceedingJoinPoint.proceed(args); System.out.println("Returning " + result); } }
以下是Student.java文件的内容:
package com.yiibai; 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(); } }
以下是MainApp.java文件的内容:
package com.yiibai; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml"); Student student = (Student) context.getBean("student"); student.getAge(); } }
以下是配置文件Beans.xml文件的内容:
运行项目
完成创建源代码和配置文件后,运行应用程序。右键单击应用程序中的MainApp.java,并使用运行方式作为Java应用程序命令。 如果您的应用程序一切正常,这将打印以下消息:
[aroundAdvice]Around advice Age : 24 [aroundAdvice] Returning 24
¥ 我要打赏 纠错/补充 收藏