持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第26天,点击查看活动详情
AspectJ基于注解的AOP实现(掌握)
AspectJ 提供了以注解方式对于 AOP 的实现。
(1)@Before前置通知实现
Step1:定义业务接口与实现类
Step2:定义切面类
类中定义了若干普通方法,将作为不同的通知方法,用来增强功能。
@Aspect //交给AspectJ框架去识别切面类,来进行切面方法的调用\
public class MyAspect {\
*/****\
**** *前置通知中的切面方法的规范**\
***** 1)* *访问权限是* *public**\
*** 2)* *没有返回值* *void**\
*** 3)* *切面方法的名称自定义**\
***** 4)* *切面方法可以没有参数* *,* *如果有也是固定的类型* *JoinPoint**\
*** 5)* *使用* *@Before* *注解表明是前切功能**\
***** 6)@Before* *的参数* *:**\
*** value:* *指定切入点表达式**\
***** public String doSome(String name, int age)**\
***/**\
***@Before(value = "execution( * com.bjpowernode.s01.*.*(..))")\
public void myBefore(){\
System.*out*.println("前置功能输出...............");\
}
切入点表达式其它形式:
@Aspect\
public class MyAspect {\
@Before(value = "execution(public void com.bjpowernode.s01.SomeServiceImpl.doSome(String,int))")\
@Before(value = "execution(* com.bjpowernode.s01.SomeServiceImpl.*(String,int))") \
@Before(value = "execution(* *...s01.SomeServiceImpl.*(..))")
@Before(value = "execution(* *.*(..))")\
public void myAspect() {\
System.*out*.println("我是前置日志处理.........");\
}\
}
Step3:声明目标对象切面类对象
Step4:注册 AspectJ 的自动代理
在定义好切面 Aspect 后,需要通知 Spring 容器,让容器生成“目标类+ 切面”的代理对象。这个代理是由容器自动生成的。只需要在 Spring 配置文件中注册一个基于 aspectj 的自动代理生成器,其就会自动扫描到@Aspect 注解,并按通知类型与切入点,将其织入,并生成代理。
aop:aspectj-autoproxy/的底层是由 AnnotationAwareAspectJAutoProxyCreator 实现的。从其类名就可看出,是基于 AspectJ 的注解适配自动代理生成器。其工作原理是,aop:aspectj-autoproxy/通过扫描找到@Aspect 定义的切面类,再由切面类根据切入点找到目标类的目标方法,再由通知类型找到切入的时间点。