在上一篇中,我们用JDK动态代理和CgLib实现了例子中的业务逻辑。那么如果用Spring,如何实现呢? 上一篇:http://my.oschina.net/lfy2008/blog/663999
我们依然有上一章的原材料:
- 业务逻辑接口:TakingTrain
- 实现类:TakingTrainImpl
- 增强的横切逻辑:CheckTicket
spring中的相关概念
增强的横切逻辑:Advice 增强类型可以分为:
- 前置增强:BeforeAdvice
- 后置增强:AfterRunningAdvice
- 环绕增强:MethodInterceptor
- 异常抛出增强:ThrowsAdvice(哈哈,现在是不是可以自己用它来控制事物)
- 引介增强:IntroductionInterceptor
CheckTicket的改造:
我们知道,CheckTicket中的方法调是在在TakingTrain的方法之前。那么,我们可以让CheckTicket实现前置增强的接口:
public class CheckTicketAdvice implements MethodBeforeAdvice{
@Override
public void before(Method method, Object[] args, Object target)
throws Throwable {
System.out.println("please show your tickes");
}
}
spring如何将这个前置增强放到我们的业务类里面呢? Spring中为我们提供了ProxyFactory来作为代理的工厂类,不管是使用的JDK动态代理还是CgLib动态代理。你在调用的时候几乎没有区别。 具体可以参考Spring的相关源码:
Spring应用
@Test
public void testAdivice(){
ProxyFactory factory = new ProxyFactory();
TakingTrain trainImpl = new TakingTrainImpl();
factory.setTarget(trainImpl);
factory.addAdvice(new CheckTicketAdvice());
TakingTrainImpl proxy = (TakingTrain) factory.getProxy();
try {
proxy.takeTrain("test");
} catch (RestException e) {
}
}
注意:以上代码Spring使用Cglib实现,如果给factory添加:factory.setInterfaces(trainImpl.getClass().getInterfaces()) 则会调用jdk动态代理。
打印:
please show your tickes
Hi test Welcome to take the train
来源:oschina
链接:https://my.oschina.net/u/917742/blog/675209