aop思想
- aop是一种思想;aop:不改变原始方法的基础上对方法进行增强
- aop中的实现:连接点–>切点–>切面—>通知—>通知类
- aop的核心实现是通过代理完成的
spring 配置
@Configuration
@PropertySource("classpath:xxx.properties")
//不使用XML的配置方式
@EnableAspectJAutoProxy
public class SpringConfig{
}
aop 配置
/**
*通知类
*/
@Configuration
@Aspect
public class Message{
/**
*@PointCut定义切点,execution指的是连接点
*/
@Pointcut("execution(com.*.find*(..))")
public void pi(){}
@Pointcut("execution(* com.*.add(..))")
public void piAround(){}
//@Before只在前执行,JoinPoint是连接点方法的参数,@After 用法一样
@Before("pi()")
public void px(JoinPoint jp){
Object[] args= jp.getArgs(); //得到是参数的数组
.... //之前执行
}
//环绕,通过ProceedingJoinPoint可告知连接点的方法在哪一步
@Around("Message.piAround()")
public Object ar(ProceedingJoinPoint pjp) throw Throwable {
//同样得到是参数的数组、
Object[] args= pjp.getArgs();
//获取签名
Signature s= pjp.getSignature();
//获取方法名
String methodName=s.getName();
//全限定类名
s.getDeclaringTypeName();
.... //执行前操作
Object res= pjp.proceed();
... //执行后操作
return res;
}
//@AfterReturning 运行结束后执行,不需要获取参数写法 @AfterReturning("pi()")
@AfterReturning(value="pi()",returning="re") //获取参数写法
public void returnning(String re){/**这里re必须和注解里一样,
*如果需要JoinPoint,JoinPoint必须放在首位(JoinPoint jp,String re)
*/
... //执行代码
}
/**
*@AfterThorwing:异常后增强;不需要获取参数写法@AfterThorwing("pi()")
*需要获取携带参数时@AfterThorwing(value="pi()",throwing="tw")
如果需要JoinPoint,JoinPoint必须放在首位(JoinPoint jp,Thorwable tw)
*/
@AfterThorwing(value="pi()",throwing="tw")
public void throwings(Thorwable tw){
....
}
}
@After和@AfterReturning
除啦在参数用法不同以外还有就是after不管程序是否有异常都会执行,而@AfterReturning必须程序无异常执行完才会实现
文章借鉴与地址