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)使用普通工厂创建对象

相关推荐
葫芦和十三4 小时前
图解 MongoDB 21|选举与 failover:Primary 是怎么选出来的
后端·mongodb·agent
GetcharZp5 小时前
26k Star 开源内网穿透神器 NetBird,一分钟实现全球设备互联!
后端
考虑考虑5 小时前
Mybatis实现批量插入
java·后端·mybatis
咖啡八杯6 小时前
GoF设计模式——中介者模式
java·后端·spring·设计模式
lizhongxuan8 小时前
多Agent之间的区别
后端
青石路10 小时前
记一次多JDK版本问题的排查,一坑套一坑,差点没爬上来
java
杨充10 小时前
1.面向对象设计思想
后端
IT_陈寒11 小时前
Java的Date类又坑了我一次,改用时间戳真香
前端·人工智能·后端
systemPro11 小时前
2.6亿条设备数据,历史查询从超时到50ms,我做了什么
后端
要阿尔卑斯吗11 小时前
提示词优化启示:为什么“按顺序输出“比“关键度评分“更有效
后端