目录
Spring的AOP-AspectJ注解方式
1.创建类,在类里面定义方法
2.创建增强类
3.进行通知的配置
(1)在Spring 配置文件中,开启直接扫描
(2)使用注解创建User 和 UserProxy 对象
(3)在增强类上面添加注解@Aspect
(4)在Spring 配置文件中开启生成代理对象
4.配置不同类型的通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
5.测试:
全部进行测试:
测试结果:
观察:
7.如果有多个增强类同时对一个方法进行增强,可以设置增强类的优先级
(1)在增强类上面添加注解@Order(数字类型值)
结果:
Spring的AOP-AspectJ注解方式
(需要看上一章把xjar包都导入才可以执行以下)
1.创建类,在类里面定义方法
新建一个aop_annotation包
在aop_annotation包内新建一个User类
User类代码如下:
package com.lbj.spring5.aop_annotation;public class User {public void add(){System.out.println("add。。。");}
}
2.创建增强类
package com.lbj.spring5.aop_annotation;//增强的类
public class UserProxy {//前置通知public void before(){System.out.println("before");}
}
3.进行通知的配置
(1)在Spring 配置文件中,开启直接扫描
bean2.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!--名称空间-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><!--开启注解扫描/开启组件扫描--><context:component-scan base-package="com.lbj.spring5.aop_annotation"></context:component-scan>
</beans>
(2)使用注解创建User 和 UserProxy 对象
一个是被增强的User类
一个是增强的UserProxy类
(3)在增强类上面添加注解@Aspect
(4)在Spring 配置文件中开启生成代理对象
4.配置不同类型的通知
(1)在增强类的里面,在作为通知方法上面添加通知类型注解,使用切入点表达式配置
package com.lbj.spring5.aop_annotation;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;//增强的类
@Component
@Aspect //生成代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void before(){System.out.println("before");}
}
5.测试:
注意事项:当我们使用了maven搭建项目的时候,bean1.xml文件需要到resources文件里面才能被使用
测试代码:
package com.lbj.spring5.test;import com.lbj.spring5.aop_annotation.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class TestAop {@Testpublic void testAopAnnotation(){//加载配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//得到对象,引入依赖User user = context.getBean("user", User.class);//调用对象的方法user.add();}
}
测试结果:
全部进行测试:
package com.lbj.spring5.aop_annotation;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;//增强的类
@Component
@Aspect //生成代理对象
public class UserProxy {//前置通知//@Before注解表示作为前置通知@Before(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void before(){System.out.println("before...");}//最终通知@After(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void after(){System.out.println("after...");}//后置通知、返回通知@AfterReturning(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void afterReturning(){System.out.println("afterReturning...");}//异常通知@AfterThrowing(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void afterThrowing(){System.out.println("afterThrowing...");}//环绕通知@Around(value = "execution(* com.lbj.spring5.aop_annotation.User.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{System.out.println("beforeAround...");//被增强的方法执行proceedingJoinPoint.proceed();System.out.println("afterAround...");}
}
测试类:
package com.lbj.spring5.test;import com.lbj.spring5.aop_annotation.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Created by 14811 on 2020/12/23.*/
public class TestAop {@Testpublic void testAopAnnotation(){//加载配置文件ApplicationContext context=new ClassPathXmlApplicationContext("bean1.xml");//得到对象,引入依赖User user = context.getBean("user", User.class);//调用对象的方法user.add();}
}
测试结果:
手动测试异常类:
明显10/0 是异常的
package com.lbj.spring5.aop_annotation;import org.springframework.stereotype.Component;//被增强的类
@Component
public class User {public void add(){int i=10/0;System.out.println("add...");}
}
测试结果:
观察:
after不管有没有异常都会执行
afterReturning 只要出现异常就不会执行
6.相同的切入点抽取
作用是:把一些重复写的写成公共部分
进行方法调用即可
7.如果有多个增强类同时对一个方法进行增强,可以设置增强类的优先级
(1)在增强类上面添加注解@Order(数字类型值)
数字类型值:越小,优先等级越高
对比:
结果:
8.完全注解开发:
(1)创建配置类,不需要创建xml配置文件
@Configuration
@ComponentScan(basePackages={''包路径''})
@EnableAspectJAutoProsy(proxyTargetClass=true)
public class ConfigAop{
}