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
相關文章
相關標籤/搜索