Spring AOP前置通知和后置通知

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

在Spring中启用AspectJ注解支持
  要在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注解声明切面
  要在Spring中声明AspectJ切面,只需要在IOC容器中将切面声明为bean实例。当在Spring IOC容器中初始化AspectJ切面之后,Spring IOC容器就会为那些与AspectJ切面相匹配的bean创建代理
  在AspectJ注解中,切面只是一个带有@AspectJ注解的Java类
  通知是标注有某种注解的简单的Java方法
  AspectJ支持5种类型的通知注解:
    @Before:前置通知,在方法执行之前返回
    @After:后置通知,在方法执行后执行
    @AfterRunning:返回通知,在方法返回结果之后执行
    @AfterThrowing:异常通知,在方法抛出异常之后
    @Around:环绕通知,围绕着方法执行

利用方法签名编写AspectJ切入点表达式
  最典型的切入点表达式时根据方法的签名来匹配各种方法:
    -execution * com.yl.spring.aop.ArithmeticCalculator.*(..):匹配ArithmeticCalculator中声明的所有方法,第一个*代表任意修饰符及任意返回值,第二个*代表任意方法,..匹配任意数量的参数。若目标类与接口与切面在同一个包中,可以省略包名。
    -execution public * ArithmeticCalculator.*(..):匹配ArithmeticCalculator接口的所有公有方法
    -execution public double ArithmeticCalculator.*(..):匹配ArithmeticCalculator中返回double类型数值的方法
    -execution public double ArithmeticCalculator.*(double, ..):匹配第一个参数为double类型的方法,..匹配任意数量任意类型的参数
    -execution public double ArithmeticCalculator.*(double, double):匹配参数类型为double,double类型的方法

后置通知
  后置通知是在连接点完成之后执行的,即连接点返回结果或者抛出异常的时候,下面的后置通知记录了方法的终止。
  一个切面可以包括一个或者多个通知

LoggingAspect.java

 1 package com.yl.spring.aop.impl;
 2
 3 import java.util.Arrays;
 4 import java.util.List;
 5
 6 import org.aspectj.lang.JoinPoint;
 7 import org.aspectj.lang.annotation.After;
 8 import org.aspectj.lang.annotation.Aspect;
 9 import org.aspectj.lang.annotation.Before;
10 import org.springframework.stereotype.Component;
11
12 //这个类声明为一个切面:需要把该类放入到IOC容器中;再声明为一个切面
13 @Aspect
14 @Component
15 public class LoggingAspect {
16
17     //声明该方法是一个前置通知:在目标方法开始之前执行
18     //@Before("execution(public int com.yl.spring.aop.impl.ArithmeticCalculatorImpl.add(int, int))")
19     @Before("execution(* com.yl.spring.aop.impl.*.*(..))")
20     public void beforeMethod(JoinPoint joinpoint) {
21         String methodName = joinpoint.getSignature().getName();
22         List<Object> args = Arrays.asList(joinpoint.getArgs());
23         System.out.println("The method " + methodName + " begins with " + args);
24     }
25     //后置通知:在目标方法执行后(无论是否发生异常),执行的通知
26     //在后置通知中,还不能访问目标方法执行的结果
27     @After("execution(* com.yl.spring.aop.impl.*.*(..))")
28     public void afterMethod(JoinPoint joinPoint) {
29         String methodName = joinPoint.getSignature().getName();
30         List<Object> args = Arrays.asList(joinPoint.getArgs());
31         System.out.println("The method " + methodName + " end with " + args);
32     }
33
34 }

配置文件applicationContext.xml:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
 7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
 9
10     <!-- 配置自动扫描的包 -->
11     <context:component-scan base-package="com.yl.spring.aop.impl"></context:component-scan>
12
13     <!-- 使AspectJ注解起作用:自动为匹配的类生成代理对象 -->
14     <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
15
16 </beans>

测试类:

 1 package com.yl.spring.aop.impl;
 2
 3 import org.springframework.context.ApplicationContext;
 4 import org.springframework.context.support.ClassPathXmlApplicationContext;
 5
 6 public class Main {
 7     public static void main(String[] args) {
 8
 9         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
10
11         ArithmeticCalculator arithmeticCalculator = ctx.getBean(ArithmeticCalculator.class);
12
13         int result = arithmeticCalculator.add(4, 6);
14         System.out.println("result: " + result);
15
16         result = arithmeticCalculator.mul(4, 6);
17         System.out.println("result: " + result);
18     }
19 }
时间: 2024-08-02 10:59:17

Spring AOP前置通知和后置通知的相关文章

spring AOP 前置增强,后置增强小Demo

服务员接口 Waiter.java package com.paic.zhangqi.spring.aop; public interface Waiter { void greetTo(String name); void serveTo(String name); } 服务员接口实现类 NaiveWaiter.java package com.paic.zhangqi.spring.aop; public class NaiveWaiter implements Waiter { @Over

Spring aop——前置增强和后置增强 使用注解Aspect和非侵入式配置

AspectJ是一个面向切面的框架,它扩展了java语言,定义了AOP语法,能够在编译期提供代码的织入,所以它有一个专门的编译器用来生成遵守字节码字节编码规范的Class文件 确保使用jdk为5.0以上版本. 01.使用注解标注增强(AspectJ)  :取代了配置文件中的aop:pointcut节点的配置 添加jar和log4j的配置文件 aspectj-1.8.7.jar aspectjweaver.jar 添加头文件: xmlns:aop="http://www.springframewo

[原创]java WEB学习笔记106:Spring学习---AOP的通知 :前置通知,后置通知,返回通知,异常通知,环绕通知

1.通知分类: @Before: 前置通知, 在方法执行之前执行 @After: 后置通知, 在方法执行之后执行 @AfterRunning: 返回通知, 在方法返回结果之后执行 @AfterThrowing: 异常通知, 在方法抛出异常之后 @Around: 环绕通知, 围绕着方法执行 关于方法签名 看第五点 2.前置通知 3.后置通知:在后置通知中,不能访问目标方法执行的结果          4.返回通知               5.异常通知 6.环绕通知 1 package com.

Spring AOP 前置通知和后置通知

加入JAR包: 在配置文件中加入AOP 的命名空间 基于注解的注解的方式,配置文件如下: beans-aop-helloworld.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema

Spring初学之annotation实现AOP前置通知和后置通知

实现两个整数的加减乘除,并在每个计算前后打印出日志. ArithmeticCalculator.java: package spring.aop.impl; public interface ArithmeticCalculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); } ArithmeticCalculatorImpl.java: package sp

Spring初学之annotation实现AOP前置通知、后置通知、返回通知、异常通知。

实现两个整数的加减乘除.在执行每个方法之前打印日志. ArithmeticCalculator.java: package spring.aop.impl; public interface ArithmeticCalculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); } ArithmeticCalculatorImpl.java: package sp

Spring初学之xml实现AOP前置通知、后置通知、返回通知、异常通知等

实现两个整数的加减乘除,在每个方法执行前后打印日志. ArithmeticCalculator.java: package spring.aop.impl.xml; public interface ArithmeticCalculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); } ArithmeticCalculatorImpl.java: packag

spring学习 十 schema-based 前置后后置通知

spring 提供了 2 种 AOP 实现方式:(1)Schema-based ,(2)AspectJ Schema-based:每个通知都需要实现接口或类,配置 spring 配置文件时在<aop:config>配置 AspectJ:每个通知不需要实现接口或类,配置 spring 配置文件是在<aop:config>的子标签<aop:aspect>中配置 基于Schema-based实现的入门程序 (1)第一步:导入jar包,除了spring中必须的包,下面两个包 (

Spring aop 前置通知

一.首先在项目中加入aop所需要的jar aopalliance-1.0.jaraspectjweaver-1.6.11.jarcommons-logging-1.1.1.jarspring-aop-3.0.5.RELEASE.jarspring-aspects-3.0.5.RELEASE.jarspring-beans-3.0.5.RELEASE.jarspring-context-3.0.5.RELEASE.jarspring-context-support-3.0.5.RELEASE.ja