最近找工作,每天更新面试题目。。。。
2021-10-19
什么是静态代理
所谓静态代理也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就已经确定了。 优点: 静态代理对(代理类)隐藏了被代理类(目标类接口)的具体实现类,在一定程度上实现了解耦合,同时也隐藏了具体的代码实现,提高了安全性! 缺点: 代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,需要为每一种方法都进行代理,就会产生很多的代理类,就会产生类爆炸类过多,静态代理在程序规模稍大时就无法胜任。如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法,增加了代码维护的复杂度。
什么是动态代理
动态代理不同于静态代理在程序运行前就已经存在代理,而是在需要的时候才去创建,而不是提前创建好,比如明星的助理有多个,需要什么就找对应的助理。 动态代理优缺点: 优点: 动态代理与静态代理相比较,最大的好处是接口中声明的所有方法都被转移到调用处理器一个集中的方法中处理(InvocationHandlerinvoke)。这样,在接口方法数量比较多的时候,可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。而且动态代理的应用使类职责更加单一,复用性更强。 缺点: 1、JDK原生动态代理是Java原生支持的,不需要任何外部依赖,但是它只能基于接口进行代理(因为它已经继承了Proxy了,Java不支持多继承),如果被代理类没有实现接口,则无法被代理。 2、CGLIB通过继承的方式进行代理、无论目标对象没有没实现接口都可以代理,但是无法处理private和final的情况(private和final修饰的方法不能被重写)
JDK动态代理和CGLIB动态代理区别
Spring 提供了两种方式来生成代理对象: JDKProxy 和 Cglib,具体使用哪种方式生成由AopProxyFactory 根据 AdvisedSupport 对象的配置来决定。默认的策略是如果目标类是接口,则使用 JDK 动态代理技术,否则使用 Cglib 来生成代理。 JDK 动态接口代理
- JDK 动态代理主要涉及到 java.lang.reflect 包中的两个类:Proxy 和 InvocationHandler。
InvocationHandler是一个接口,通过实现该接口定义横切逻辑,并通过反射机制调用目标类 的代码,动态将横切逻辑和业务逻辑编制在一起。Proxy 利用 InvocationHandler 动态创建 一个符合某一接口的实例,生成目标类的代理对象。 CGLib 动态代理 - :CGLib 全称为 Code Generation Library,是一个强大的高性能,高质量的代码生成类库,可以在运行期扩展 Java 类与实现 Java 接口,CGLib 封装了 asm,可以再运行期动态生成新的 class。和 JDK 动态代理相比较:JDK 创建代理有一个限制,就是只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,则可以通过 CGLib 创建动态代理。
什么是正向代理,什么是反向代理
正向代理即是客户端代理, 代理客户端, 服务端不知道实际发起请求的客户端 反向代理即是服务端代理, 代理服务端, 客户端不知道实际提供服务的服务端 正向代理中,proxy和client同属一个LAN,对server透明; 反向代理中,proxy和server同属一个LAN,对client透明。 实际上proxy在两种代理中做的事都是代为收发请求和响应,不过从结构上来看正好左右互换了下,所以把后出现的那种代理方式叫成了反向代理
为什么要用代理
代理就是给目标类提供一个代理对象,由代理对象控制目标对象的引用。(比如从西安买飞机票到厦门,可以去机场买,也可以去代售点买,代售点就代理了机场的售票窗口,我们就不用去机场买票了) java的代理就是不直接访问目标,而是通过一个中间层来访问目标
代理有啥好处呢?①通过代理对象的方式间接的访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性,②通过代理对象对原有的业务增强。 当我们需要引入其它一些功能。比如在业务层记录一些方法的调用日志,我们就可以创建一个代理类,每次调用目标方法的时候,先通过代理类记录了当前调用的时间和IP地址,是谁调用此方法用了多长时间。 可能有人会说为什么要加个代理类?直接在原来类的方法里面加上记录日志这个逻辑不就可以了么? 这样就会出现问题了,当某一天有些类的一些方法不需要记录日志了,我们就要去修改这些类的每一个方法。在程序设计中类的单一性原则问题,这个原则很简单,就是每个类的功能尽可能的单一。为什么要单一,因为只有功能单一这个类被改动的可能性才会最小。 如果我们做了代理,我们就可以把目标的代理类删掉就可以了,这样我们也就不用去修改目标类了。
策略模式(策略类膨胀的时候怎么解决),单例模式(几种实现方式),工厂模式,代理模式
GC垃圾回收的几种算法
如保证线程安全
JVM调优的经历
原子包的的实现过程
Redis的几种数据结构
什么是缓存雪崩、什么是缓存穿透,该如何避免
谈谈对spring的认识,springbean的生命周期
IOC原理
Ioc 提供了一个bean容器,容器会帮助我们创建对象,不需要我们手动的创建,IOC容器有个非常强大的功能叫做依赖注入,通过写java代码创建bean,通过type等方式自动的注入,正是有了这个依赖注入使得我们IOC有了一个强大的功能叫解耦,
AOP原理
MVC流程
mybatis缓存
kafka原理及作用
数据结构-位图介绍
spring常用注解中对bean的处理
volatile关键字的作用及和sychronized的区别
如何合理的设置线程池
jvm类加载过程
2021-10-20
事务失效的几种情况
事务嵌套怎么处理
单例模式的实现的原理(为什么每次获取到的都是同一个对象)
|