Spring AOP中pointcut expression表达式解析
声明一个切入点
<bean id="userService" class="cn.sxt.service.impl.UserServiceImpl"/>
<bean id="log" class="cn.sxt.log.Log"/>
<bean id="afterLog" class="cn.sxt.log.AfterLog"/>
<aop:config>
<aop:pointcut expression="execution(* cn.sxt.service.impl.*.*(..))" id="pointcut"/>
<aop:advisor advice-ref="log" pointcut-ref="pointcut"/>
<aop:advisor advice-ref="afterLog" pointcut-ref="pointcut"/>
</aop:config>
Pointcut 是指那些方法需要被执行AOP ,是由Pointcut Expression来描述的
切面(Aspect):一个关注点的模块化
通知(Advice):在切面的某个特定的连接点上执行的动作
织入(Weaving):把切面连接到其他的应用程序类型或者对象上,并创建一个被通知的对象
前置通知(Before Advice)
后置通知(After Advice)
异常通知(After Throw Advice)
最终通知(After (finally) Advice)
环绕通知(Around Advice)
<aop:config>
<aop:pointcut expression="execution(* cn.sxt.service.impl.*.*(..))" id="pointCut"/>
<aop:advisor advice-ref="log" pointcut-ref="pointCut"/>
</aop:config>
execution后面的*表示所有返回值 impl后面的第一个*表示这个包下面的所有类,第二个*表示类里面所有的方法,(..)表示方法包括参数和无参的
Spring AOP就是将公共的业务(如日志,安全等)和领域业务结合,当执行领域业务时,将会把公共业务加进来。实现公共业务的重复利用。领域业务更纯粹,程序员专注于领域业务。其本质还是动态代理。
第二种实现方式AOP ---自定义实现AOP
<bean id="userService" class="cn.sxt.service.impl.UserServiceImpl"/>
<bean id="log" class="cn.sxt.log.Log"/>
<aop:config>
<aop:aspect ref="log">
<aop:pointcut expression="execution(* cn.sxt.service.impl.*.*(..))" id="pointcut"/>
<aop:before method="before" pointcut-ref="pointcut"/>
<aop:after method="after" pointcut-ref="pointcut"/>
</aop:aspect>
</aop:config>
第三种实现方式---通过注解实现
<bean id="userService" class="cn.sxt.service.impl.UserServiceImpl"/>
<bean id="log" class="cn.sxt.log.Log"/>
<aop:aspectj-autoproxy/>
@Aspect
public class Log {
@Before("execution(* cn.sxt.service.impl.*.*(..))")
public void before(){
System.out.println("-----方法执行前-----");
}
@After("execution(* cn.sxt.service.impl.*.*(..))")
public void after(){
System.out.println("-----方法执行后-----");
}
@Around("execution(* cn.sxt.service.impl.*.*(..))")
public Object aroud(ProceedingJoinPoint jp) throws Throwable{
System.out.println("环绕前");
System.out.println("签名:"+jp.getSignature());
//执行目标方法
Object result = jp.proceed();
System.out.println("环绕后");
return result;
}
}
例如:支付业务---接入第三方接口---安全检测---进行身份验证---资金验证---支付