Spring AOP动态代理-通知

时光毁灭记忆、已成空白 提交于 2020-03-01 03:50:29

在上一篇中,我们用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  

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!