汕头企业网站推广技巧,社交网络的推广方法有哪些?,google免登录网页版,d0906网站建设与管理目录
代理模式
静态代理
动态代理
1. JDK动态代理
创建⼀个代理对象并使用
2. CGLIB动态代理
SpringAOP底层原理面试 代理模式
Spring AOP是基于动态代理模式来实现的
代理模式#xff1a;静态代理模式动态代理模式
代理模式, 也叫委托模式。
定义#xff1a;为其…目录
代理模式
静态代理
动态代理
1. JDK动态代理
创建⼀个代理对象并使用
2. CGLIB动态代理
SpringAOP底层原理面试 代理模式
Spring AOP是基于动态代理模式来实现的
代理模式静态代理模式动态代理模式
代理模式, 也叫委托模式。
定义为其他对象提供一种代理以控制对这个对象的访问。 它的作用就是通过提供一个代理类, 让我们在调用目标方法的时候, 不再是直接对目标方法进行调用, 而是通过代理类间接调用。
在某些情况下, 一个对象不适合或者不能直接引用另一个对象, 而代理对象可以在客户端和目标对象之间起到中介的作用。 静态代理
在程序运行前代理对象就已经对目标对象进行了步骤的预执行代码
代理模式的主要角色
1. Subject: 业务接口类. 可以是抽象类或者接口(不⼀定有)
2. RealSubject: 业务实现类. 具体的业务执行, 也就是被代理对象.
3. Proxy: 代理类. RealSubject的代理.
例如房屋租赁
Subject 提前定义了房东做的事情, 交给中介代理, 也是中介要做的事情
RealSubject: 房东
Proxy: 中介 上述程序中, 虽然静态代理也完成了对目标对象的代理, 但是由于代码都写死了, 对目标对象的每个方法的增强都是手动完成的非常不灵活. 所以日常开发几乎看不到静态代理的场景。
动态代理
相比于静态代理来说动态代理更加灵活。不需要针对每个目标对象都单独创建⼀个代理对象, 而是把这个创建代理对象的工作推迟到程序运行时由JVM来实现。也就是动态代理在程序时, 根据需要动态创建生成、运行。
例如房屋中介, 不需要提前预测有哪些业务, 而是业务来了再根据情况创建。 动态代理常见的实现方式JDK动态代理JDK提供的和CGlib动态代理第三方
1. JDK动态代理
定义JDK动态代理类实现 InvocationHandler接口
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class JDKInvocationHandler implements InvocationHandler {//⽬标对象即就是被代理对象private Object target;public JDKInvocationHandler(Object target) {this.target target;}Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Thro// 代理增强内容System.out.println(我是中介, 开始代理);//通过反射调⽤被代理类的⽅法Object retVal method.invoke(target, args);//代理增强内容System.out.println(我是中介, 代理结束);return retVal;}
}
创建⼀个代理对象并使用
public class DynamicMain {public static void main(String[] args) {HouseSubject target new RealHouseSubject();//创建⼀个代理类通过被代理类、被代理实现的接⼝、⽅法调⽤处理器来创建HouseSubject proxy (HouseSubject) Proxy.newProxyInstance(target.getClass().getClassLoader(),new Class[]{HouseSubject.class},new JDKInvocationHandler(target));proxy.rentHouse();}
}
1. InvocationHandler
InvocationHandler 接口是Java动态代理的关键接口之一, 它定义了⼀个单⼀方法invoke() , 用于处理被代理对象的方法调用。
2. Proxy
Proxy 类中使用频率最高的方法是 newProxyInstance() , 这个方法主要用来生成一个代理对象。
2. CGLIB动态代理
JDK 动态代理只能代理实现了接口的类有些场景下业务代码是直接实现的并没有接口定义为了解决这个问题, 可以使用CGLIB动态代理机制来解决。
CGLIB 通过继承方式实现代理。Spring中的AOP模块中: 如果目标对象实现了接口则默认采用JDK 动态代理, 否则采用CGLIB 动态代理。
CGlib依赖
dependencygroupIdcglib/groupIdartifactIdcglib/artifactIdversion3.3.0/version
/dependency
两种动态代理JDK和CGlib的区别
1.CGlib既可以代理类也可以代理接口。
SpringAOP底层原理面试
1.springAOP是怎样实现的
spring AOP是基于动态代理实现的
2.动态代理是如何实现的
spring动态代理有两种方式实现JDK和CGlib
3.JDK和CGlib都是实现动态代理的方式spring使用的是哪个
两者都用
4.什么时候使用JDK什么时候使用CGlib?
代理接口可以使用JDK也可以使用CGLIB
代理类只能使用CGLIB
源码中通过proxyTargetClass这个设置项来设置的