Spring面试题pro版-2

Spring框架是由于软件开发的复杂性而创建的。Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅仅限于服务器端的开发。从简单性、可测试性和松耦合性角度而言,绝大部分Java应用都可以从Spring中受益。

ApplicationContext的实现类有哪些?

ClasspathxmlapplicationContext:

他是从类的根路径下加载配置文件。

FilesystemxmlApplicationContext:

他是从磁盘路径上加载配置文件,配置文件可以在磁盘的任意位置。

AnnotationConfigApplicationContext:

当我们使用注解容器配置容器对象时,需要使用此类来创建Spring 容器。它用来读取注解。

Bean标签的属性?

作用:用于配置对象让Spring创建。默认调用类中的无参构造函数,如果没有无参构造函数不能创建成功。

属性:

id,给bean一个唯一标识。

class:指定类的全限定类名。用于反射对象,默认情况下调用无参构造函数。

scope:指定对象的作用范围。

singleton:默认值。单例。

prototype:多例

request ,session ,global session。

init-method:指定类中初始化方法。

destory-method:指定类中的销毁方法。

Bean的作用范围和生命周期?

Bean在Spring框架中扮演着核心角色,它们代表了应用程序中的对象,并由Spring容器负责其创建、配置和管理。Bean的作用范围和生命周期是Spring框架中两个重要的概念。

Bean的作用范围

Bean的作用范围决定了Bean实例在Spring容器中的可见性和生命周期。Spring提供了几种不同的作用范围,以满足不同场景的需求:

  1. Singleton(单例):这是Spring中Bean的默认作用范围。在整个Spring容器中,无论多少次请求该Bean,都只会返回同一个Bean实例。这意味着Bean实例在容器初始化时创建,并在容器关闭时销毁,期间始终为同一个对象。
  2. Prototype(原型):对于原型作用范围的Bean,每次从容器中请求该Bean时,都会创建一个新的Bean实例。这意味着每次获取到的Bean都是一个新的对象。
  3. Request:这种作用范围的Bean只在一次HTTP请求的生命周期内有效。每次请求都会有一个新的Bean实例,不同请求之间的Bean实例不共享。
  4. Session:这种作用范围的Bean在整个用户会话期间有效。对于同一个用户的多次请求,都会返回同一个Bean实例。
  5. Global Session:这种作用范围通常用于Portlet环境,类似于Session,但在全局范围内有效。
  6. WebSocket:这种作用范围的Bean在WebSocket连接的生命周期内有效,仅适用于WebSocket应用程序。
Bean的生命周期

· singleton :一个应用只有一个对象的实例。它的作用范围就是整个引用。

生命周期:当应用加载,创建容器时,对象就被创建了。只要容器在,对象一直活着。当应用卸载,销毁容器

时,对象就被销毁了。

prototype:每次访问对象时,都会重新创建对象实例。

生命周期:当使用对象的时候,创建新的对象实例。只要对象在使用中,就一直活着。当对象长时间不用时, 被java的垃圾回收器回收了。

request:在一次http 请求中, 一个bean 定义对应一个实例。作用域仅在基于web 的Spring applicationContext 中有效。当请求处理结束后, request 域的实例会被销毁。

· session :一个HTTP Session 中,一个bean 定义对应一个实例。该作用域仅在基于web 的Spring

ApplicationContext 情形下有效。与request 作用域一样,可以根据需要放心的更改所创建实例的内部状态, 而别的HTTP Session 中根据userPreferences 创建的实例,将不会看到这些特定于某个HTTP Session 的状态 变化。当HTTP Session 最终被废弃的时候,在该HTTP Session 作用域内的bean 也会被废弃掉。

· globalsession:当一个bean 的作用域为global session,表示在一个全局的http session 中, 一个 bean 对 应一个实例。仅仅在基于portlet 的web应用中才有意义。Portlet 规范定义了全局Session 的概念,它被所有构成某个portlet web 应用的各种不同的portlet 所共享。在global session 作用域中定义的bean 被限定于全 局portlet Session 的生命周期范围内。

Spring循环依赖是如何解决的?

当我们的类A 中引用 B , B 引用C ,C 又引用A 的时候,这个时候会产生循环依赖。 Spring 所解决的循环依赖是有限

定条件的。首先bean 必须是要单例模式。其次需要通过get ,set 的方式注入才行。使用构造器方式注入和多例模 式都不能解决循环依赖的问题。

根据Spring 的初始化流程。 Spring 先是用构造实例化Bean 对象 ,此时Spring 会将这个实例化结束的对象放到一 个Map 中,并且Spring 提供了获取这个未设置属性的实例化对象引用的方法。

首先理解为我们先实例化A ,A 此时并没有,于是从一级缓存区中取A,取不到,然后取二级缓存区中取A,也取不 到,最后通过对象的匿名工厂方法,创建了一个未装载完毕的实例A。放入三级缓存区中。然后 B 对象依然与A 走 了一套相同的流程。 C 对象初始化的时候,发现所需要的A 已经有了,虽然是不完全的,但是也可以用,于是C 对 象的创建就完善了。放到一级缓存区中。 C 对象完善后, B 对象将创建好的C 对象初始化后,放到一级缓存区中。 B 对象也装载完毕,然后A 对象最后装载完毕。

Spring实例化bean有哪些方式?

(1)使用默认的无参构造函数

(2)使用静态工厂方式创建对象

(3)使用普通工厂创建对象

相关推荐
hanbarger22 分钟前
mybatis框架——缓存,分页
java·spring·mybatis
cdut_suye30 分钟前
Linux工具使用指南:从apt管理、gcc编译到makefile构建与gdb调试
java·linux·运维·服务器·c++·人工智能·python
苹果醋342 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行43 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
azhou的代码园1 小时前
基于JAVA+SpringBoot+Vue的制造装备物联及生产管理ERP系统
java·spring boot·制造
wm10431 小时前
java web springboot
java·spring boot·后端
smile-yan1 小时前
Provides transitive vulnerable dependency maven 提示依赖存在漏洞问题的解决方法
java·maven
老马啸西风1 小时前
NLP 中文拼写检测纠正论文-01-介绍了SIGHAN 2015 包括任务描述,数据准备, 绩效指标和评估结果
java
Earnest~2 小时前
Maven极简安装&配置-241223
java·maven
皮蛋很白2 小时前
Maven 环境变量 MAVEN_HOME 和 M2_HOME 区别以及 IDEA 修改 Maven repository 路径全局
java·maven·intellij-idea