AOP操作及术语
术语
- 连接点:
类内可以增强的方法叫连接点 - 切入点
实际被增强的方法被称为切入点 - 通知(增强)
实际增强的逻辑部分被称为通知 - 切面
把通知应用到切入点的过程称为通知
五种通知类型
//被增强类
@Component
public class User {
public void add(){
// System.out.println(1/0);
System.out.println("add");
}
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("bean2.xml");
User user = app.getBean("user", User.class);
user.add();
}
}
@Before 前置通知
@AfterReturning 后置通知
@After 后置通知
@Around 环绕通知 在方法前后执行
@AfterThrowing 异常通知
//增强类
@Component
@Aspect //生成代理对象
public class UserProxy {
//前置通知
@Before(value="execution(* com.muzi.aop.User.add(..))")
public void before(){
System.out.println("123");
}
//后置通知
@AfterReturning(value="execution(* com.muzi.aop.User.add(..))")
public void after(){
System.out.println("after");
}
//异常通知
@AfterThrowing(value="execution(* com.muzi.aop.User.add(..))")
public void exception(){
System.out.println("exception");
}
//after方法执行之后执行,afterreturning返回值之后执行
//环绕通知
@Around(value="execution(* com.muzi.aop.User.add(..))")
public void circle(ProceedingJoinPoint pro) throws Throwable {
System.out.println("环绕之前");
pro.proceed();
System.out.println("环绕之后");
}
}
两个技巧
在AOP中我们可以把公共切入点抽取
@Pointcut(value="切入方法")
public void add(){
}
//之后其他的增强的方法只需,将方法写到value中即可,实现了代码的复用
//异常通知
@AfterThrowing(value="add()")
public void exception(){
System.out.println("exception");
}
在AOP中我们可以通过**@Order**设置增强方法的优先级
//增强类一
@Component
@Order(1)
class PersonProxy{
@Before(value="execution(* com.muzi.aop.User.add(..))")
public void before(){
System.out.println("1");
}
}
@Component
@Order(2)
//增强类二
class Person1Proxy{
@Before(value="execution(* com.muzi.aop.User.add(..))")
public void before(){
System.out.println("2");
}
}
//被增强类
@Component
public class User {
public void add(){
System.out.println("add");
}
//调用被增强方法
public static void main(String[] args) {
ApplicationContext app=new ClassPathXmlApplicationContext("bean2.xml");
User user = app.getBean("user", User.class);
user.add();
}
}
输出结果
1
2
add
显然值越小,优先级越高