AOP-使用注解方式实现
1.创建切面类
切面类包含通知和切入点,在创建切面类之前,需要了解一下AspectJ的切点表达式,因为需要通过切点表达式定义切点,用于准确的定位应该在什么地方使用切面的通知。
对切点表达式有所了解后,我们通过@Aspect注解标注创建切面类。
在定义完这个切面类之后可以发现execution表达式内容完全一致,这里可用@Pointcut优化。
2.创建目标类,定义目标方法
目标类是核心,开会前、开会中、开会后、中间休息等等地方都是插入切面通知的地方,这些地方的集合就是连接点,而某一个具体的位置就是切点,连接点就是切点集合。
创建一个工具类,作为切面插入的目标。
开会接口的实现:
在定义完这个切面类之后可以发现execution表达式内容完全一致,这里可用@Pointcut优化。
切点表达式含义:
通过execution指示器,选择ConferenceServiceImpl类中的conference()方法。
方法表达式以“”开始,表明不关心返回值是什么。
对于方法参数列表通过“…”表示不在乎conference的参数。
在执行表达式的时候,可以通过逻辑运算符&&(and)、!(not)、||(or)对表达式进行搭配。比如:
execution( com.ycy.aop.ConferenceServiceImpl.conference(…)&&within(com.ycy.aop.*))
增加了一个限制:只管com.ycy.aop下的包,这里的&&可以使用and代替。
3.编写配置类,启动AOP代理功能
切面类、目标方法都创建完成,但是目前切面类在启动时不会被转化为代理。
现通过@EnableAspectJAutoProxy注解自动代理。
JavaConfg配置:
注:
Jdk代理:基于接口的代理,一定是基于接口,会生成目标对象的接口的子对象。
Cglib代理:基于类的代理,不需要基于接口,会生成目标对象的子对象。
1.注解@EnableAspectJAutoProxy开启代理
2.如果proxyTargetClass默认为false,表示使用jdk动态代理织入增强
3.如果proxyTargetClass设置默认为true,表示使用Cglib动态代理技术织入增强
4.如果proxyTargetClass默认为false,但目标类没有声明接口,Spring aop还是会使用Cglib动态代理,也就是说非接口的类要生成代理都用Cglib