Q:什么是代理?静态代理和动态代理的区别?JDK代理和CGLIB代理的区别?
代理就是说通过一个代理对象来访问目标对象,目的是在不修改目标对象类的代码的情况下,对原有的方法进行增强
静态代理:代理类和目标类在编译期就已确认,代理类需要手动编写,且代理类与目标类需要实现同一个接口
动态代理:代理类在运行时动态生成,不需要手动编写代理类,适用于需要多个类生成代理类的场景
JDK动态代理
原理:基于Java反射机制,在运行时创建目标接口的代理类,拦截方法调用并织入切面逻辑
优缺点:
- 纯java实现,无需额外的依赖
- 轻量级,运行时生成代理类速度快
- (缺点)仅支持接口,目标类必须至少实现一个接口
2.CGLIB代理
原理:通过继承子类,运行时生成子类,重写目标方法以织入切面逻辑
优缺点:
- 支持类代理,无需目标类实现接口
- final/方法不支持,无法代理有final修饰的类或方法
- 性能开销,生成代理类的速度低于JDK动态代理
Q:事务的特征
- 原子性:事务中的所有操作要么全部完成,要么全部不执行。
- 一致性:事务执行的结果必须使数据库从一个一致性状态转换到另一个一致性状态。
- 隔离性:多个事务并发执行时,一个事务的操作不应该影响其他事务。
- 持久性:一旦事务提交,它对数据库的改变就是永久性的。
事务的特性有四种,分别是原子性,一致性,隔离性,持久性
Q:Srping的Bean生命周期
1.实例化:第1步,实例化一个bean对象;
2.属性赋值:第2步,为bean设置相关属性和依赖;
3.初始化:第3~7步,步骤较多,第3、4步在初始化前执行。第5、6步为初始化操作。第7步在初始化后执行,该阶段结束才能被用户使用
4.销毁:第8~10步,第8步不是真正意义的销毁(因为下一步才正式使用),但是在这一步会注册销毁的相关调用接口,在第9、10步真正的销毁bean时执行对应的方法