看完这篇文章之后,面试官再也不敢问我什么是Spring的Bean了

创作内容丰富的干货文章很费心力,感谢点过此文章的读者,点一个关注鼓励一下作者,激励他分享更多的精彩好文,谢谢大家!


什么是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的几种方式

  1. Set方法注入
  2.  构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
  3.  静态工厂注入
  4.  实例工厂
你怎样定义类的作用域?


        当在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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值