参考资料: SpringBoot深入浅出2.x
这个真的是太难啦 !??差点又给了
Spring Aop是基于动态代理模式实现的,动态代理模式就是生成一个代理对象来增强或者控制对被代理对象的访问。
比如 被代理对象是 泡面, 那代理对象就是老八。在每次准备吃泡面时,老八会及时出现,并做一些对泡面的增强,我们可以通过老八来增加吃泡面时的体验。
上代码:
泡面接口
public interface CupNoodle {
public void eat();
}
泡面实现类
public class NaoCanSuanCai implements CupNoodle {
@Override
public void eat() {
System.out.println("奥力给!干了兄弟们!");
}
}
动态代理 老八
public class ProxyBean implements InvocationHandler{
private Object target = null;
private Interceptor interceptor = null;
public Object bind(Object target){
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
public void majorMeterials() {
System.out.println("香蕉火腿老干妈");
}
public void minorMeterials() {
System.out.println("往里倒点哇哈哈");
}
public void afterEat(){
System.out.println("这小滋味儿 每级啦");
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
this.majorMeterials();
this.minorMeterials();
Object ret = method.invoke(target, args);
this.afterEat();
return ret;
}
}
测试:
public static void main(String args[]){
CupNoodle cupNoodle = (CupNoodle)new ProxyBean().bind(new NaoCanSuanCai());
cupNoodle.eat();
}
核心是 代理类通过bind方法(这个bind方法只是举例), 生成一个动态代理对象与真实业务对象绑定之后返回。
当调用真实业务对象的方法时,实际上调用的是动态代理类实现的InvocationHandler接口的 invoke方法, 之后invoke通过反射机制来调用真实业务对象的方法。
输出结果
你以为你调用的是泡面的方法,但其实泡面早就被老八控制住了。
原文:https://www.cnblogs.com/bigAssBoy/p/12781546.html