Advisor与@Aspect
@Aspect是定义切面的方式(“怎么写”),它是一个使用注解的、声明式的、高可读性的编程模型。Advisor是 Spring AOP 框架中切面的底层模型(“是什么”),它是一个将单个通知(Advice)和切入点(Pointcut)组合在一起的原子单元。
其中advisor是一种比较低级的切面,@Aspect是一种高级切面,最后@Aspect的执行都会被转化为多个advisor低级切面。
下面将要展示两种切面的使用方式。
Aspect切面
static class Target1{public void foo(){System.out.println("target1 foo");}}static class Target2{public void bar(){System.out.println("target2 bar");}}@Aspectstatic class Aspect1{@Before("execution(* foo())")public void beforeFoo(){System.out.println("before foo");}@Before("execution(* bar())")public void beforeBar(){System.out.println("before bar");}}aspectJ切面基于注解实现,可以前置后置以及环绕通知都有对应的注解,这是现在比较常见的使用方式。
Advisor切面
@Configurationstatic class Config{@Bean//低级切面public Advisor advisor3(MethodInterceptor advice3){AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression("execution(* foo())");return new DefaultPointcutAdvisor(pointcut, advice3);}@Beanpublic MethodInterceptor advice3(){return invocation -> {System.out.println("advice3 before");Object proceed = invocation.proceed();System.out.println("advice3 after");return proceed;};}}advisor切面需要使用pointcut切点以及advice通知来创建,是一种比较低级的切面,使用起来比较麻烦。
总体代码:
public class a19 {public static void main(String[] args) {GenericApplicationContext context = new GenericApplicationContext();context.registerBean("aspect1", Aspect1.class);context.registerBean("config", Config.class);context.registerBean(ConfigurationClassPostProcessor.class);context.refresh();for(String name : context.getBeanDefinitionNames()){System.out.println(name);}}static class Target1{public void foo(){System.out.println("target1 foo");}}static class Target2{public void bar(){System.out.println("target2 bar");}}@Aspectstatic class Aspect1{@Before("execution(* foo())")public void beforeFoo(){System.out.println("before foo");}@Before("execution(* bar())")public void beforeBar(){System.out.println("before bar");}}@Configurationstatic class Config{@Bean//低级切面public Advisor advisor3(MethodInterceptor advice3){AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression("execution(* foo())");return new DefaultPointcutAdvisor(pointcut, advice3);}@Beanpublic MethodInterceptor advice3(){return invocation -> {System.out.println("advice3 before");Object proceed = invocation.proceed();System.out.println("advice3 after");return proceed;};}}
}

