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提供了几种不同的作用范围,以满足不同场景的需求:
- Singleton(单例):这是Spring中Bean的默认作用范围。在整个Spring容器中,无论多少次请求该Bean,都只会返回同一个Bean实例。这意味着Bean实例在容器初始化时创建,并在容器关闭时销毁,期间始终为同一个对象。
- Prototype(原型):对于原型作用范围的Bean,每次从容器中请求该Bean时,都会创建一个新的Bean实例。这意味着每次获取到的Bean都是一个新的对象。
- Request:这种作用范围的Bean只在一次HTTP请求的生命周期内有效。每次请求都会有一个新的Bean实例,不同请求之间的Bean实例不共享。
- Session:这种作用范围的Bean在整个用户会话期间有效。对于同一个用户的多次请求,都会返回同一个Bean实例。
- Global Session:这种作用范围通常用于Portlet环境,类似于Session,但在全局范围内有效。
- 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)使用普通工厂创建对象