<bean id="common" class="com.cn.jgweb.utils.Common"/>
<bean id="check" class="com.cn.jgweb.utils.TestAop"/>
<aop:config>
<aop:aspect id="myAop" ref="check"> //ref指向check
<aop:pointcut id="target" expression="within(com.cn.jgweb.utils.*)"/> //表示在com.cn.jgweb.utils.* 在这个包下的所有类所有方法都有aop参与
<aop:before method="before" pointcut-ref="target"/> //指定前置方法
<aop:after method="after" pointcut-ref="target"/> //指定后置方法
</aop:aspect>
</aop:config>
-
任意公共方法的执行:
execution(public * * (..))
-
任何一个名字以“set”开始的方法的执行:
execution(* set* (..))
-
AccountService
接口定义的任意方法的执行:
execution(* com.cn.service.AccountService.*(..))
-
在service包中定义的任意方法的执行:
execution(* com.cn.service.*.*(..))
-
在service包或其子包中定义的任意方法的执行:
execution(* com.cn.service..*.*(..))
-
在service包中的任意连接点(在Spring AOP中只是方法执行):(这个包下所有方法都执行)
within(com.cn.service.*)
-
在service包或其子包中的任意连接点(在Spring AOP中只是方法执行):
(这个包及子包下所有方法都执行)
within(com.cn.service..*)
-
实现了
AccountService
接口的代理对象的任意连接点 (在Spring AOP中只是方法执行):
this(com.cn.service.AccountService)
-
实现
AccountService
接口的目标对象的任意连接点 (在Spring AOP中只是方法执行):
target(com.cn.service.AccountService)
-
任何一个只接受一个参数,并且运行时所传入的参数是
Serializable
接口的连接点(在Spring AOP中只是方法执行)
args(java.io.Serializable)
请注意在例子中给出的切入点不同于
execution(* *(java.io.Serializable))
: args版本只有在动态运行时候传入参数是Serializable时才匹配,而execution版本在方法签名中声明只有一个
Serializable
类型的参数时候匹配。
-
目标对象中有一个
@Transactional
注解的任意连接点 (在Spring AOP中只是方法执行)
@target(org.springframework.transaction.annotation.Transactional)
-
任何一个目标对象声明的类型有一个
@Transactional
注解的连接点 (在Spring AOP中只是方法执行):
@within(org.springframework.transaction.annotation.Transactional)
-
任何一个执行的方法有一个
@Transactional
注解的连接点 (在Spring AOP中只是方法执行)
@annotation(org.springframework.transaction.annotation.Transactional)
-
任何一个只接受一个参数,并且运行时所传入的参数类型具有
@Classified
注解的连接点(在Spring AOP中只是方法执行)
@args(com.cn.security.Classified)
-
任何一个在名为'
tradeService
'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):
bean(tradeService)
-
任何一个在名字匹配通配符表达式'
*Service
'的Spring bean之上的连接点 (在Spring AOP中只是方法执行):
bean(*Service)
我的理解是: 先拦截住这个方法,然后调用切面before方法, 然后在运行 add方法
拦截规则:
com.bjsxt.service 下的所有子类的 add (..) 有参数方法
JoinPoint joinPoint String name = joinPoint.getSignature().getName(); name是当前方法的类名,
Class<? extends Object> class1 = joinPoint.getTarget().getClass(); 可以获取类名的class Object[] args = joinPoint.getArgs(); 获取参数(参数为list)
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest(); //在aop中获取request