Spring AOP动态代理-通知

在上一篇中,咱们用JDK动态代理和CgLib实现了例子中的业务逻辑。那么若是用Spring,如何实现呢? 上一篇:http://my.oschina.net/lfy2008/blog/663999spring

咱们依然有上一章的原材料:ide

  • 业务逻辑接口:TakingTrain
  • 实现类:TakingTrainImpl
  • 加强的横切逻辑:CheckTicket

spring中的相关概念

加强的横切逻辑:Advice 加强类型能够分为:.net

  • 前置加强: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的相关源码: 输入图片说明code

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动态代理。blog

打印:接口

please show your tickes
Hi test Welcome to take the train
相关文章
相关标签/搜索