================== Spring AOP注解配置 ================== 1 创建项目 IDEA 新建项目 Maven 名称:AnnotationAOP 组ID:cn.tedu 工件ID:annotationaop 版本:1.0.0 2 添加依赖 org.springframework spring-context 5.3.14 org.springframework spring-aspects 5.3.14 3 创建包 cn.tedu.annotationaop 4 配置文件 在/src/main/resources目录下创建applicationContext.xml的文件: 保存为模板。 将base-package属性设置为实体类所在包路径cn.tedu.annotationaop。 5 切入点类 在cn.tedu.annotationaop.util包中创建类: @Component public class Pointcuts { public void pointcut(boolean throwException) { System.out.println("-切入点-"); if (throwException) throw new NullPointerException(); } } 6 切面类 在cn.tedu.annotationaop.aspect包中创建类: @Component @Aspect public class Advices { @Before("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))") public void before() { System.out.println("前置增强"); } @After("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))") public void after() { System.out.println("后置增强"); } @AfterThrowing("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))") public void after_throwing() { System.out.println("异常增强"); } @AfterReturning("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))") public void after_returning() { System.out.println("返回增强"); } @Around("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环增切前"); Object retval = pjp.proceed(); // 执行切入点 System.out.println("环增切后"); return retval; } } 或 @Component @Aspect public class Advices { @Pointcut("execution(void cn.tedu.annotationaop.util.Pointcuts.pointcut(boolean))") public void pointcut() {} @Before("pointcut()") public void before() { System.out.println("前置增强"); } @After("pointcut()") public void after() { System.out.println("后置增强"); } @AfterThrowing("pointcut()") public void after_throwing() { System.out.println("异常增强"); } @AfterReturning("pointcut()") public void after_returning() { System.out.println("返回增强"); } @Around("pointcut()") public Object around(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环增切前"); Object retval = pjp.proceed(); // 执行切入点 System.out.println("环增切后"); return retval; } } 7 测试类 在cn.tedu.annotationaop.test包中创建类: public class AdvicesTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Pointcuts pointcuts = context.getBean("pointcuts", Pointcuts.class); pointcuts.pointcut(true); } } 环增切前 前置增强 -切入点- 异常增强 后置增强 Exception in thread "main" java.lang.NullPointerException ... public class AdvicesTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Pointcuts pointcuts = context.getBean("pointcuts", Pointcuts.class); pointcuts.pointcut(false); } } 环增切前 前置增强 -切入点- 返回增强 后置增强 环增切后 例程:AnnotationAOP 与XML文件相比,通过注解配置AOP显然更加方便,但只能在源代码上加注解。 - 如果切面类是自己写的类,建议使用注解配置AOP; - 如果切面类来自第三方包,只能通过XML文件配置AOP。