- spring通过Advisor(切面)将Pointcut和Advice组装起来,有了Advisor的信息,spring就可以利用JDK或CGLIB动态代理技术采用统一的方式为目标Bean创建织入切面的代理对象 了。
- spring使用增强类定义横切逻辑.增强既包括横切逻辑,又包含部分连接点信息。
增强类型
AOP联盟为增强定义了org.aopalliance.aop.Advice接口。spring支持5中类型的增强。
- 前置增强:BeforeAdvice。
- 后置增强:AfterReturningAdvice
- 环绕增强:org.aopalliance.intercept.MethodInterceptor
- 异常抛出增强:ThrowsAdvice.
- 引介增强:IntroductionInterceptor。在目标类中添加一些新的属性和方法。
这些增强接口都有一些方法,通过实现这些接口方法,并在接口方法中定义横切逻辑,就可以将他们织入目标类方法的相应连接点。
示例
public interface Waiter {
public void serve(String name);
}
public class NaiveWaiter implements Waiter {
@Override
public void serve(String name) {
System.out.println("serve to:"+name);
}
}
public class GreetingBeforeAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target) throws Throwable {
System.out.println("hello "+args[0]);
}
}
public class BeforeAdviceTest {
public static void main(String[] args) {
Waiter target = new NaiveWaiter();
BeforeAdvice advice = new GreetingBeforeAdvice();
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.setTarget(target);
proxyFactory.addAdvice(advice);
Waiter proxy = (Waiter) proxyFactory.getProxy();
proxy.serve("tom");
}
}
剖析ProxyFactory
proxyFactory内部就是使用JDK或CGLIB动态代理技术的。spring定义了一个AopProxy接口。并提供了两个final类型的实现类:Cglib2AopProxy,JdkDynamicAopProxy。可以通过指定proxyFactory.setInterfaces(Class[] interface)方法指定使用JdkDynamicAopProxy。还可以通过proxyFactory.setOptimize(true)方法指定使用cglib.默认使用cglib.
在spring中配置
<bean id="greetingAdvice" class="x.x.GreetingAdvice"/>
<bean id="target" class="x.x.NaiveWaiter"/>
<bean id="water" class="org.springframework.aop.framework.ProxyFactoryBean" p:proxyInterfaces="x.x.Waiter"
p:interceptorNames="greetingAdvice"
p:target-ref="target"/>