本文包含以下内容:
什么是AOP
引入AOP依赖、创建测试类
建立配置类,并交由Spring管理
通过Spring 管理AOP 测试
1.什么是AOP
AOP为Aspect Oriented Programming的缩写,是 面向切面编程。在应用层面可以理解为:在某个指定的方法执行的前,执行后,执行异常时等不同状态时,运行指定的方法。指在程序运行期间 动态的将某段代码切入到 指定方法指定位置进行运行的编程方式。其中可以使用Spring 封装好的 AOP 注解进行标记对应的切面函数,达到实现面向切面编程思维的作用。Spring封装的通知方法如下:
前置通知( @Before):logStart:在目标方法(div)运行之前运行 后置通知( @After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束) 返回通知( @AfterReturning):logReturn:在目标方法(div)正常返回之后运行 异常通知( @AfterThrowing):logException:在目标方法(div)出现异常以后运行 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())下面开始编码测试:2.引入AOP依赖、创建测试类
1)引入spring-aspects 依赖<dependency> <groupId>org.springframeworkgroupId> <artifactId>spring-aspectsartifactId> <version>4.3.12.RELEASEversion>dependency>
2)建立目标函数,即切面函数
public class MathCalculator { public int div(int i,int j){ System.out.println("MathCalculator...div..."); return i/j; }}
3)建立动态切入的函数:可以通过
@P
oint
cut 注解抽象出 切入点避免重复代码的编写。
可以同类下可以直接引用切点方法,可以填写切点的
切入点表达式
JoinPoint作为参数时,必须放在
第一位,否则
报错
@Before("pointCut()") 标记运行开始前
@After("com.atguigu.aop.LogAspects.pointCut()") 标记运行介绍后
@AfterReturning(value="pointCut()",returning="result") 可以通过returning将返回值返回
@AfterThrowing(value="pointCut()",throwing="exception") 通过exception将异常排除
@Aspectpublic class LogAspects { //抽取公共的切入点表达式 //1、本类引用 //2、其他的切面引用 @Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))") public void pointCut(){}; //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入) @Before("pointCut()") public void logStart(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}"); } @After("com.atguigu.aop.LogAspects.pointCut()") public void logEnd(JoinPoint joinPoint){ System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After"); } //JoinPoint一定要出现在参数表的第一位 @AfterReturning(value="pointCut()",returning="result") public void logReturn(JoinPoint joinPoint,Object result){ System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}"); } @AfterThrowing(value="pointCut()",throwing="exception") public void logException(JoinPoint joinPoint,Exception exception){ System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}"); }}
3.建立配置类,并交由Spring管理
1)将切面类和切面方法,加入到容器中,并且添加 @EnableAspectJAutoProxy 注解启用基于注解的面向切面模式@EnableAspectJAutoProxy@Configurationpublic class MainConfigOfAOP { //业务逻辑类加入容器中 @Bean public MathCalculator calculator(){ return new MathCalculator(); } //切面类加入到容器中 @Bean public LogAspects logAspects(){ return new LogAspects(); }}
2)在切面类上加上
@Aspect
注解 向Spring表名这是一个切面类
@Aspectpublic class LogAspects
4.通过Spring 管理AOP 测试
1.单独建立,类的实例化对象,运行方法@Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class); //1、不要自己创建对象 MathCalculator mathCalculator = new MathCalculator(); mathCalculator.div(1, 1); }
得到结果:没有通过Spring 容器,将
不会运行对应的切面函数
2)通过容器获得实例化对象:
@Test public void test01(){ AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class); MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class); mathCalculator.div(1, 0); applicationContext.close(); }
得到结果:运行前执行Before 函数、运行结束运行After ,正常返回运行@AfterReturning 方法。
结果二:运行发生异常,运行异常方法
-END-
可以关注我的公众号,免费获取价值1980元学习资料
点击“在看”,学多少都不会忘~