Spring AOP簡介與底層實現(xiàn)機制——動態(tài)代理
創(chuàng)建緩存實例
JetCache通過Spring AOP生成代理霎肯,來支持緩存功能。
AopContext.currentProxy()該用法的意義
原來在springAOP的用法中,只有代理的類才會被切入,我們在controller層調用service的方法的時候宪塔,是可以被切入的侯嘀,但是如果我們在service層 A方法中,調用B方法看幼,切點切的是B方法展懈,那么這時候是不會切入的销睁,解決辦法就是如上所示,在A方法中使用
((Service)AopContext.currentProxy()).B() 來調用B方法存崖,這樣一來冻记,就能切入了!
AopContext.currentProxy()的使用
解決方案就是把service的A方法中對B的調用改成代理對象的調用来惧,怎么獲取代理對象呢冗栗,AopContext.currentProxy()使用ThreadLocal保存了代理對象,因此((Service) AopContext.currentProxy()).B()就能解決供搀。
Spring Cache注解無效:可能是類內方法調用注解緩存的方法
// Application.java
@EnableAspectJAutoProxy(exposeProxy = true)
public class Application {
public static void main(final String[] args) {
SpringApplication.run(Application.class, args);
}
}
// PublicService.java
public interface PublicService {
void publicMethod(String id, String msg);
}
// PrivateService.java
public interface PrivateService {
String privateMethod();
}
@Service
public class PublicServiceImpl implements PublieService, PrivateService {
@Override
@Cached(name = "PrivateMethod", expire = CommonConstant.REMOTE_CACHE_DEFAULT_EXPIRE_SECONDS)
private String privateMethod(){ return "xxx"; }
public void publicMethod() {
String str = ((PrivateService) AopContext.currentProxy()).privateMethod();
}
}