Spring AOP 架構

Spring AOP 架構

Spring AOP 架構的核心是建立在代理上的。Spring 內部有兩種實現代理的方法:JDK動態代理和CGLIB代理。

1 Spring 中的聯結點

Spring 只支持一種聯結點:方法調用。

2 Spring 中的方面

Spring AOP 中,一個方面是由一個實現了Advisor(通知者)接口的類表示的。兩個子接口:

IntroductionAdvisor 引入通知者(控制對哪些類實施引入)

PointcutAdvisor 切入點通知者

關於ProxyFactory 

ProxyFactory 類控制着Spring AOP中的織入和創建代理的過程,控制哪些方面需要織入到代理中去。

在 Spring 中創建通知

Spring 支持五種通知:

前置通知 MethodBeforeAdvice

後置通知 AfterReturningAdvice

包圍通知 MethodInterceptor

拋出通知 ThrowAdvice

引    入 IntroductionInterceptor

示例程序說明:

演示前置通知與後置通知

package cuigh.spring.aop.step01;

/*

 * 功能:演示在代理類中是否可以知道參數的類型

 * */

public class User {

String name;

int age;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

package cuigh.spring.aop.step01;

/*

 * 功能:目標類

 * */

public class MessageWriter {

public void writeMessage(String name){

System.out.print(" World ");

}

public void writeMessage2(User user){

System.out.print("World 2 ");

}

}

package cuigh.spring.aop.step01;

import java.lang.reflect.Method;

import org.springframework.aop.MethodBeforeAdvice;

public class MyBeforeAdvice implements MethodBeforeAdvice {

/**

 * 功能:前置通知

 */

@Override

public void before(Method method, Object[] args, Object target)

throws Throwable {

System.out.println("方法執行前通知,方法名稱="+method.getName()+"\n");

System.out.println("參數類型="+args[0].getClass().getName());

}

}

package cuigh.spring.aop.step01;

import java.lang.reflect.Method;

import org.springframework.aop.AfterReturningAdvice;

/**

 * 功能:後置通知

 */

public class MyAfterReturningAdvice implements AfterReturningAdvice {

@Override

public void afterReturning(Object returnValue, Method method,

Object[] args, Object target) throws Throwable {

System.out.println("方法執行後增加邏輯,方法名="+method.getName());

}

}

package cuigh.spring.aop.step01;

import org.springframework.aop.framework.ProxyFactory;

public class AdviceExample {

/**

 * 功能:演示前置、後置通知

 */

public static void main(String[] args) {

//創建目標類與通知類

MessageWriter target = new MessageWriter();

MyBeforeAdvice advice = new MyBeforeAdvice();

ProxyFactory pf = new ProxyFactory();

pf.addAdvice(advice);

pf.setTarget(target);

MessageWriter proxy = (MessageWriter)pf.getProxy();

proxy.writeMessage("zhang");

System.out.println("\n--------------");

proxy.writeMessage2(new User());

System.out.println("增加方法執行後的邏輯-------------------");

//創建第二個通知類

MyAfterReturningAdvice advice2 = new MyAfterReturningAdvice();

pf.addAdvice(advice2);

proxy.writeMessage("after");

}

}

程序輸出:

方法執行前通知,方法名稱=writeMessage

參數類型=java.lang.String

 World 

--------------

方法執行前通知,方法名稱=writeMessage2

參數類型=cuigh.spring.aop.step01.User

World 2 增加方法執行後的邏輯-------------------

方法執行前通知,方法名稱=writeMessage

參數類型=java.lang.String

 World 方法執行後增加邏輯,方法名=writeMessage

發佈了36 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章