Spring
本文回答以下问题,文内可能有遗漏、错误或表达不够清晰的地方。
① spring中bean的生命周期是怎样的?
② 属性注入和构造器注入哪种会有循环依赖的问题?
③ AOP的实现原理和场景,java动态代理和cglib动态代理的区别
④ spring事务传播、事务隔离级别
⑤ spring boot 自动配置原理
⑥ spring 框架有哪些扩展点
① spring中bean的生命周期是怎样的?
Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:
Bean自身的方法、Bean级接口方法、后处理器级接口方法、工厂后处理器接口方法。
bean的生命周期(简略回答):
实例化:选择该类的一个构造方法,实例化得到对象。
依赖注入:Spring 会判断对象属性上是否有@Autowired 类似注解,有就把这些属性找出来,填充属性。
初始化(Bean级接口方法):Spring 会判断对象是否实现了 xxxAware 相关接口;判断是否实现了 InitializingBean 接口或自定义 init 方法;如若实现则进行回调。
初始化(后处理器级接口方法):Spring 会判断是否存在某个方法被@PostConstruct注解修饰;判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要会进行动态代理并生成一个代理对象做为Bean。
销毁bean:实现了 DisposableBean 接口的 Bean 会被销毁。
② 属性注入和构造器注入哪种会有循环依赖的问题?
属性注入可能会有循环依赖的问题,项目使用时构造器注入优于属性注入。
- spring是如何解决依赖的
@Service
publicclass TestService1 {
@Autowired
private TestService2 testService2;
public void test1() {
}
}
@Service
publicclass TestService2 {
@Autowired
private TestService1 testService1;
public void test2() {
}
}
③ AOP的实现,java动态代理和cglib动态代理的区别?
Spring AOP是基于动态代理的,如果要代理的对象实现了某个接口,那么Spring AOP就会使用JDK动态代理去创建代理对象;而对于没有实现接口的对象,就无法使用JDK动态代理,转而使用 cglib 动态代理生成一个被代理对象的子类来作为代理。
JDK动态代理只提供接口的代理,不支持类的代理。核心 InvocationHandler接口和Proxy类,InvocationHandler 通过invoke()方法反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起;接着,Proxy利用 InvocationHandler动态创建一个符合某一接口的的实例, 生成目标类的代理对象。
如果代理类没有实现 InvocationHandler 接口,那么Spring AOP会 选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。 CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final, 那么它是无法使用CGLIB做动态代理的。
一个Advisor(通知器)由一个Pointcut(切点)和一个Advice(通知)组成的。
AbstractAdvisorAutoProxyCreator:只要Spring容器中存在这个类型的Bean,就相当于开启了AOP。
- aop 过程(在一个 bean 的生命周期中):
1、找到所有的通知器Advisor,然后判断当前这个Bean是否存在某个Advisor与之匹配(根据Pointcut),如果匹配就表示当前这个Bean有对应的切面逻辑,需要进行AOP来产生一个代理对象。(Spring 通过创建一个代理对象工厂 ProxyFactory产生代理对象)
2、代理对象执行某个方法时,会把 代理对象工厂 ProxyFactory 中的 Advisor 拿出来和当前正在执行的方法进行匹配筛选。
④ spring事务传播
spring 事务的7种传播行为:https://blog.csdn.net/weixin_39625809/article/details/80707695
常用的有 REQUIRED、REQUIRES_NEW、NESTED
-
REQUIRED
如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务。
内层事务抛异常或者外层事务抛异常都会回滚。 -
REQUIRES_NEW
如果存在一个事务,先将这个存在的事务挂起,再开启一个新的事务。如果没有事务则开启一个新的事务。
外层事务抛异常:外层事务回滚,内层事务不回滚。
内层事务抛异常,外层事务捕获内层事务抛的异常,未向上抛异常:内层事务回滚,外层事务不回滚。
内层事务抛异常,外层事务捕获内层事务抛的异常,向上抛异常:都回滚;
- NESTED
如果存在一个事务,依赖该事务,作为该事务的子事务。如果没有事务则开启一个新的事务。
外层事务抛异常:都回滚。
内层事务抛异常,外层事务捕获内层事务抛的异常,未向上抛异常:内层事务回滚,外层事务不回滚。
内层事务抛异常,外层事务捕获内层事务抛的异常,向上抛异常:都回滚;
⑤ spring boot 自动配置原理
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 是自动配置的核心, @EnableAutoConfiguration 给容器导入META-INF/spring.factories 里定义的自动配置类。
@Configuration、@ConditionalOnClass 筛选有效的自动配置类。
每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能
引入了一个(延迟的、导入自动配置类的)选择器,扫描所有jar包中 META-INF/spring.factories 目录下的文件,导入自动配置类,判断自动配置类生效。
⑥ spring 框架有哪些扩展点
FactoryBean:Mybatis的Mapper接口的动态代理对象、FeignClient接口的动态代理
@Import注解:核心作用就是导入配置类,根据配置类实现了什么接口注入什么样的Bean(如注册BeanDefinition)
Bean的生命周期:生命周期的回调
BeanPostProcessor:在Bean创建的过程中起作用,如Dubbo中可以通过@DubboReference(@Reference)来引用生产者提供的接口
BeanFactoryPostProcessor:对Spring容器做处理
Spring SPI机制:SpringFactoriesLoader,导入xxxAutoConfiguration
SpringBoot启动扩展点:如自动装配、Nacos实现读取json格式的配置文件、SpringBoot启动成功后台通过CommandLineRunner命令行启动器来加载数据
Spring Event 事件:事件的发布订阅
命名空间:...
引用文章
https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247524146&idx=2&sn=ebfa45facb58a19ca52936b71b5bf900
https://pdai.tech/md/interview/x-interview-2.html
https://www.cnblogs.com/crazymakercircle/p/14465630.html
网友评论