在AOP的xml配置实现中,我们经常使用以下语句:
<!--原始共功能需要配置成spring控制的资源-->
<bean id="userService" class="com.ych.service.impl.UserServiceImpl"/>
<!-- 抽取的功能也要配置-->
<bean id="myAdvice" class="com.ych.aop.AOPAdvice"/>
<!-- AOP的配置-->
<aop:config>
<!-- 为切入点配置唯一的id,切入点表示从哪个方法进行抽取-->
<aop:pointcut id="pt" expression="execution(* *..*(..))"/>
<!-- 声明切面,切面表示切入点和通知Advice的关系,ref表示通知的id-->
<aop:aspect ref="myAdvice">
<!-- before 表示是从切入点的代码之前抽取的代码;method代表方法名;point-ref是之前切入点的id-->
<!-- 谁配置在前,谁先加载-->
<aop:before method="before" pointcut-ref="pt"/>
<aop:before method="before1" pointcut="execution(* *..*(int)) && args(j)"/>
</aop:aspect>
</aop:config>
而当我们需要使用注解开发的时候,
<aop:pointcut id="pt" expression="execution(* *..*(..))"/>
注意到这条语句中有对切入点唯一id的声明,以及相应的切入点表达式对被抽取方法的匹配,那么在对应的注解开发中,我们使用@Pointcut进行等效配置。
首先要明确的是,切入点表达式不能变,这是匹配到切入点的关键所在。那么设置切入点的唯一id “pt” 应该怎么做呢。
这时候我们会理所当然的想到,在spring中的@value和@autowired等属性注解。那么我们可不可以进行类似的操作?答案是不可以。
这里对切入点进行唯一的id=pt声明,并没有任何实际意义,仅仅只是一种命名,不应该占用空间,而如果使用某个变量对切入点的id进行声明,无论如何都是要占用内存空间的。而使用void类型的方法,可以在不占用任何内存空间的情况下,完成相同的任务。于是我们得到——
@Pointcut("execution(* *..*(..))")
public void pt() {
}
最后附上aop注解开发的基本框架(对比xml)