简单介绍:
之前我们介绍了关于XML的面向切面的编程,通过配置文件的方法,在不修改源代码的情况下完成了对已有方法的增强 除了基于XML配置文件的方式,我们还可以使用更简单的,基于注解的方式。
每一次,我们在使用面向切面的注解的时候,我们都要明确三个问题,插什么?插谁?插在哪? 这三个问题也就对应了我们面向切面中的切面,增强,切入点,关系。带着这样的问题去学习基于注解的AOP的实现会理解的比较快一点
使用方法:
首先,我们来介绍一下我们需要用到的注解:
@Aspect:配置切面 @Pointcut:配置切入点 @Before:配置前置通知 @After:配置后置通知 @Around:配置环绕通知 @AfterReturning:配置返回通知 @AfterThrowing:配置异常通知
这些注解都是写在切面中的,也就是说我们只需要一个切面类,一个目标类,然后在配置文件中添加 切面类的<bean>标签和目标类的<bean>标签,最后配置一下自动代理就可以了。
代码实现:
打开我们之前的基于XML配置方式的AOP的实现,我们对切面和XML配置文件进行改造一下,其他的类都不需要改变。
首先我们来到XML配置文件,我们把配置AOP的标签全部都删除,添加一个自动代理的标签:
<?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:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 开启自动代理--><aop:aspectj-autoproxy/><bean id="actionUser" class="Semester_4.AOP.Annotation_based_AOP.ActionUser"/><bean id="userEnhancement" class="Semester_4.AOP.Annotation_based_AOP.UserEnhancement"/></beans>
然后来到我们的切面类中,在适当的地方添加我们的注解:
package Semester_4.AOP.Annotation_based_AOP;import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;@Aspect() //配置切面,其实就是声明这是一个切面
public class UserEnhancement {
// 配置切入点,关于切入点的配置需要说明一下
// 切入点需要配置在一个空方法上面,而之后在配置增强与切入点的关系的时候,我们需要将切入点的注解下面的方法的方法名当作参数填入到增强与切入点之间关系的注解的括号里面当作参数@Pointcut("execution(* Semester_4.AOP.Annotation_based_AOP.ActionUser.*(..))")public void point(){}
// 配置增强方法与被增强方法的关系@Before("point()")public void chink(){System.out.println("基于注解的模拟检查权限的过程……");}@After("point()")public void log(){System.out.println("基于注解的模拟写入日志的过程……");}
}
我们的测试类也是一样的,我们运行之前的测试类进行测试
运行结果:
可以看到,我们依然正常完成了对已有方法的增强,并且使用注解的方式会更加的方便
注意点:
在注解的使用中,首先就是对各个注解的作用一定要了解,对于不同的注解的使用方法一定要知道,其次就是我们要去在XML配置文件中需要添加一个自动代理的标签,才能让我们的自动代理的AOP发挥作用