Spring第8章: @aspectj 和 schema的aop:
上一章的Spring aop还是使用比较复杂,现在Spring使用@Aspectj就方便了。
Spring aop升级
🤔aspectj也是动态代理技术?不是编译期植入吗?答:是的
- 上一章中,继承StaticMethodMatcherPointcutAdvisor来表示定义切点,实现MethodBeforeAdvice来定义增强advice。在xml中吧advice引入切点形成切面(advisor),再利用代理类ProxyFactoryBean实现aop。
- 现在用@aspectj来描述切点、增强advice。
@Aspect
public class PreGreetingAspect {
@Before(“execution(* greetTo(..))”)
public void beforeGreeting(){
System.out.println(“你好”);
}
}
AspectJProxyFactory factory = new AspectJProxyFactory();
NaiveWaiter target = new NaiveWaiter();
factory.setTarget(target);
factory.addAspect(PreGreetingAspect.class);
Waiter proxy = factory.getProxy();
proxy.greetTo(“yuyu”);
proxy.serveTo(“uu”);
虽然和第7章形似、这里和第7章都set了target。但是7章会对target里面所有的方法织入,说白了没有切点。这里已经通过注解@Before(“execution(* greetTo(…))”)实现了切点的精准查找和织入。
- 把上述代码实现转换为xml配置实现:实现了自动把target和切面组合、当然应该也可以通过xml配置精准组合。
<aop:aspectj-autoproxy/>
<bean id=“waiter-j” class=“chap8.pojo.NaiveWaiter”/>
<bean class=“chap8.aspectj.PreGreetingAspect”/>
ApplicationContext context = new ClassPathXmlApplicationContext(“chap8/aspectj-aop.xml”);
Waiter waiter = (Waiter) context.getBean(“waiter-j”);
waiter.greetTo(“Auto Sir”);
aspectj语法
还有通配符、逻辑运算符
- 不同类型的增强advice
- @Before
- @AfterReturning
- @Around
- @AfterThrowing
- @After
- @DeclareParents :相当于introduce
切点函数暂不详细复习
@aspectj进姐,暂不详细复习:复合运算、织入顺序、访问连接点信息…
基于schema的@aspectj也不看,因为现在都可以用注解
对比(第7章没有用任何<aop: 命名空间>)
<aop: >是新Spring加的,不是@aspectj独有的, @aspectj可以使用<aop: >配置
总结:
- 在@aspectj中,核心就是:
- 写一个带有@aspectj注解的配置类,编程切点函数。
- 剩下的工作就是装配:找target和连接点、最终织入。很简单。
- 而第7章Spring aop中,需要
- 实现一个advice;
- 使用(继承)一个切点切面类,进行切点的定义;
- 利用xml和ProxyFactoryBean来组合在一起。