spring常见面试题:IOC、循环依赖、设计模式

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 spring常见面试题:IOC、循环依赖、设计模式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、谈谈你对SpringIOC的理解

在这里插入图片描述

二、BeanFactory和FactoryBean的区别

在这里插入图片描述

三、spring中用到哪些设计模式?

在这里插入图片描述

四、applicationContext和BeanFactory的区别

在这里插入图片描述

五、谈谈你对循环依赖的理解

在这里插入图片描述
请添加图片描述

六、springboot自动装配实现的原理

1、当启动springboot应用程序的时候,会选创建SpringApplication的对象,在对象的构造方法中会进行某些参数的初始化工作,最主要的是判断当前应用程序的类型以及初始化器和监听器,在这个过程中会加载整个应用程序中的spring.factories文件,将文件的内容放到缓存中,方便后续获取。

2、SpringApplication对象创建完成之后,开始执行run方法,来完成整个启动,启动过程中最主要的有两个方法,第一个是prepareContext,第二个是refreshContext,在这两个关键步骤中完成了自动装配的核心功能,前面的处理逻辑包含了上下文对象的创建,banner的打印,异常报告器的准备等各个准备工作,方便后续来进行调用。

3、在prepareContext方法中主要是完成对上下文对象的初始化操作,包括了属性值的设置,比如环境对象,在整个过程中有一个非常重要的方法,叫做load,load主要完成一件事,将当前启动类作为一个beanDefinition注册到registry中,方便后续在进行BeanFactoryPostProcessor调用执行的时候,找到对应的主类,来完成@SpringBootApplication,@EnableAutoConfiguration等注解的解析工作。

4、在refreshContext方法中会进行整个容器的刷新过程,会调用spring中的refresh方法,refresh方法中有13个非常关键的方法,来完成整个spring应用程序的启动,在自动装配过程中,会调用invokeBeanFactoryPsotProcessor方法,在此方法中主要是对ConfigurationClassPostProcessor类的处理,这个是BFPP的子类,也是BDRPP的子类,在调用的时候会先调用BDRPP中的postProcessBeanDefinitionRegistry方法,然后调用postProcessBeanFactory方法,在执行postProcessBeanDefinitionRegistry的时候会解析处理各种注解,包含@PropertySource,@ComponentScan,@ComponentScans,@Bean,@Import等注解,最主要的是@Import注解的解析。

5、在解析@Import注解的时候,会有一个getImports方法,从主类开始递归解析注解,把所有包含@Import的注解都解析到,然后在processImport方法中对Import的类进行分类,此处主要是识别的时候AutoConfigurationImportSelect归属于ImportSelect的子类,在后续过程中会调用deferredImportSelectorHandler中的process方法,来完成EnableAutoConfiguration的加载。

七、Spring中事务的传播特性

1.传播特性总结

在这里插入图片描述

2.REQUIRED和NESTED回滚的区别

在回答这两种方式区别的时候,最大的问题在于保存点的设置,很多同学回认为内部设置REQUIRED和NESTED效果是一样的,其实在外层方法对内层方法的异常情况在进行捕获的时候区别很大,使用REQUIRED的时候,会报”Transaction rolled back because it has been marked as rollback-only”信息,因为内部异常了,设置了回滚标记,外部捕获异常后,要进行事务的提交,此时发现回滚标记,意味着要回滚,所以会报异常。而NESTED不会发生这种情况,因为在回滚的时候把回滚标记清除了,外部捕获异常后去提交,没发现回滚标记,就可以正常提交了

3.REQUIRED_NEW和NESTED的区别

这两种方式产生的效果是一样的,但是REQUIRED_NEW会有新的连接产生,而NESTED使用的是当前事务的连接,而且NESTED还可以回滚到保存点,REQUIRED_NEW每次都是一个新的事务,单独回滚,但NESTED其实是一个事务,外层事务可以控制内层事务的回滚,内层就算没有异常,外层出现异常,也可以全部回滚。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/130209.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!