Spring面试知识点

代理

静态代理
所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和真实主题角色的关系在运行前就确定了。代理对象和实际对象都继承了同一个接口,在代理对象中指向的是实际对象的实例,这样对外暴露的是代理对象而真正调用的是 Real Object
静态代理的问题:
1、 当需要代理多个类的时候,由于代理对象要实现与目标对象一致的接口,有两种方式:
只维护一个代理类,由这个代理类实现多个接口,但是这样就导致代理类过于庞大
新建多个代理类,每个目标对象对应一个代理类,但是这样会产生过多的代理类
2、 当接口需要增加、删除、修改方法的时候,目标对象与代理类都要同时修改,不易维护。
动态代理
动态代理的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以在运行前并不存在代理类的字节码文件。
为什么类可以动态的生成?
Java虚拟机类加载过程主要分为五个阶段:加载、验证、准备、解析、初始化。其中加载阶段需要完成以下3件事情:
通过一个类的全限定名来获取定义此类的二进制字节流
将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据访问入口
由于虚拟机规范对这3点要求并不具体,所以实际的实现是非常灵活的,关于第1点,获取类的二进制字节流(class字节码)就有很多途径:
从ZIP包获取,这是JAR、EAR、WAR等格式的基础
从网络中获取,典型的应用是 Applet
运行时计算生成,这种场景使用最多的是动态代理技术
通过实现接口的方式 -> JDK动态代理
JDK动态代理主要涉及两个类:java.lang.reflect.Proxy 和 java.lang.reflect.InvocationHandler
在 invoke 方法中编写方法调用的逻辑处理
获取动态生成的代理类的对象须借助 Proxy 类的 newProxyInstance 方法
基于Java反射机制实现,必须要实现了接口的业务类才能用这种办法生成代理对象。
缺点:JDK 动态代理是基于接口设计实现的,如果没有接口,会抛异常。
代理类的特点:
代理类和所有方法都被 public final 修饰,所以代理类只可被使用,不可以再被继承
代理类继承了 Proxy 类,并且实现了被代理的所有接口,以及equals、hashCode、toString等方法
每个方法都有一个 Method 对象来描述,Method 对象在static静态代码块中创建,以 m + 数字 的格式命名
通过继承类的方式 -> CGLIB动态代理
实现方式实现 MethodInterceptor 接口,重写 intercept 方法,通过 Enhancer 类的回调方法来实现。
基于ASM机制实现,通过生成业务类的子类作为代理类。
CGLib 采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑,来完成动态代理的实现。
优点:
无需实现接口,达到代理类无侵入
只操作我们关心的类,而不必为其他相关类增加工作量。
https://juejin.im/post/5c1ca8df6fb9a049b347f55c

Spring IOC

IOC是控制反转,也就是说获得依赖对象的过程被反转了,控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。

Spring AOP

面向切面编程,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只负责完成业务逻辑。它们并不负责其它的系统级关注点,例如日志或事务支持。
通知的5种类型:
Before 在方法被调用之前调用
After 在方法完成后调用通知,无论方法是否执行成功
After-returning 在方法成功执行之后调用通知
After-throwing 在方法抛出异常后调用通知
Around 在被通知的方法调用之前后调用之后执行自定义的行为
切点
连接点 就是你准备在系统中执行切点和切入通知的地
通知 我们准备加入的方法
切面是切点和通知的集合,一般单独作为一个类。通知和切点共同定义了关于切面的全部内容,它是什么时候,在何时和何处完成功能。

Spring bean的生命流程

https://blog.youkuaiyun.com/qq_30163473/article/details/94655373
循环依赖
spring IOC 与 spring AOP
https://segmentfault.com/a/1190000010734016

Spring 事务

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值