创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家!
什么是Spring Bean?
Spring Bean 是那些形成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些Bean通过容器中配置的元数据创建。比如,以XML文件中的形式定义。
一个 Spring Bean 定义包含什么?
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个Bean,它的生命周期详情及它的依赖。
如何给Spring 容器提供配置元数据?Spring有几种配置方式?
这里有三种重要的方法给Spring 容器提供配置元数据。
- XML配置文件。
- 基于注解的配置。
- 基于java的配置。
Spring配置文件包含了哪些信息
Spring配置文件是个XML 文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。
Spring基于xml注入Bean的几种方式
- Set方法注入
- 构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
- 静态工厂注入
- 实例工厂
你怎样定义类的作用域?
当在Spring里定义一个Bean后,我们还能给这个Bean声明一个作用域。它可以通过bean 定义中的scope属性来定义。当Spring要在需要的时候每次生产一个新的bean实例,bean的scope属性被指定为prototype。另一方面,一个bean每次使用的时候必须返回同一个实例,这个bean的scope属性必须设为singleton。
解释Spring支持的几种bean的作用域
Spring框架支持以下五种bean的作用域:
- singleton : Bean在每个Spring ioc 容器中只有一个实例。
- prototype:一个Bean的定义可以有多个实例。
- request:每次http请求都会创建一个Bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
- session:在一个HTTP Session中,一个Bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
- global-session:在一个全局的HTTP Session中,一个Bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
注意: 缺省的Spring Bean的作用域是Singleton。使用prototype作用域需要慎重的思考,因为频繁创建和销毁Bean会带来很大的性能开销。
Spring框架中的单例bean是线程安全的吗?
不是,Spring框架中的单例bean不是线程安全的。Spring 中的 Bean 默认是单例模式,Spring 框架并没有对单例 Bean 进行多线程的封装处理。实际上大部分时候 Spring Bean 无状态的(比如 dao 类),所有某种程度上来说 bean 也是安全的,但如果 Bean 有状态的话(比如 view model 对象),那就要开发者自己去保证线程安全了,最简单的就是改变 Bean 的作用域,把“singleton”变更为“prototype”,这样请求 bean 相当于 new Bean()了,所以就可以保证线程安全了。
- 有状态就是有数据存储功能。
- 无状态就是不会保存数据。
Spring如何处理线程并发问题?
在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal。