-
spring AOP 底層是使用動態代理實現的。
-
AOP 動態代理實現方式有兩種:JDK 動態代理、CGLIB 動態代理。那如何選擇動態代理方式呢。
如果代理類實現了接口,則採用JDK代理模式
如果代理類沒有實現接口,則採用CGLIB動態代理模式
如果代理類實現了接口,但是強制使用CGLIB代理,則使用CGLIB代理(比如給類註解@EnableAspectJAutoProxy(proxyTargetClass = true)) -
AOP 疊加是使用責任鏈模式
Chain.class
package com.example.demo.chain;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import java.util.List;
public class Chain {
private List<ChainHandler> handlers;
private int index = 0;
public Chain(List<ChainHandler> handlers) {
this.handlers = handlers;
}
public void process(){
if(index >= handlers.size()){
return;
}
handlers.get(index++).execute(this);
}
}
ChainHandler.class
package com.example.demo.chain;
public abstract class ChainHandler {
public void execute(Chain chain){
this.handlerProcess();
chain.process();
}
public abstract void handlerProcess();
}
ChainClient.class
package com.example.demo.chain;
import java.util.Arrays;
public class ChainClient {
public static void main(String[] args) {
class HandlerA extends ChainHandler{
@Override
public void handlerProcess() {
System.out.println("handler chain A");
}
}
class HandlerB extends ChainHandler{
@Override
public void handlerProcess() {
System.out.println("handler chain B");
}
}
class HandlerC extends ChainHandler{
@Override
public void handlerProcess() {
System.out.println("handler chain C");
}
}
Chain chain = new Chain(
Arrays.asList(
new HandlerA(),
new HandlerB(),
new HandlerC()
)
);
chain.process();
}
}
- AOP 通知順序
Beforearound
Before
do action (動作)
Afteraround
After
AfterReturning