文章目录
一、Bean知识点梳理
1、Bean 定义
bean 是一个被实例化,组装,并通过 Spring IoC 容器所管理的对象。
配置元数据的信息:
- 如何创建一个 bean
- bean 的生命周期的详细信息
- bean 的依赖关系
配置属性说明:
2、Bean的作用域
3、Bean的生命周期
简单的说,Bean的生命周期分为四个阶段:Bean的定义——Bean的初始化——Bean的使用——Bean的销毁
。详细流程图如下:
4、Bean的依赖注入
4.1、通过类构造函数
4.2、通过Setter 方法
集合注入:
5、Bean的自动装配
Bean的注入主要分为ByType(使用@Autowired注解)和ByName(使用@Resource注解)注入。下面为相关的注解描述:
序号 | 注解 | & 描述 |
---|---|---|
1 | @Required | @Required 注解应用于 bean 属性的 setter 方法。 |
2 | @Autowired | @Autowired 注解可以应用到 bean 属性的 setter 方法,非 setter 方法,构造函数和属性。 |
3 | @Qualifier | 通过指定确切的将被连线的 bean,@Autowired 和 @Qualifier 注解可以用来删除混乱。 |
4 | JSR-250 Annotations | Spring 支持 JSR-250 的基础的注解,其中包括了 @Resource,@PostConstruct 和 @PreDestroy 注解。 |
二、Bean与Spring容器的关系
三、Bean的线程安全问题
Spring中对Bean本身并没有作线程安全处理。使用过程中需要开发者自身设计保证Bean的线程安全。
- bean 分为有状态 bean 和无状态 bean;
有状态 bean
即类定义了成员变量,可能被多个线程同时访问,则会出现线程安全问题;
无状态 bean
每个线程访问不会产生线程安全问题,因为各个线程栈及方法栈资源都是独立的,不共享。
解决Bean的线程安全问题方案:
对于无状态Bean,可以共享,不存在线程安全性问题;
对于无状态Bean:
- 可以使用Bean作用域 scope=prototype。各个线程使用自己的实例对象,来保证线程安全。
- 使用 threadLocal 进行处理,ThreadLocal
是线程本地变量,每个线程拥有变量的一个独立副本,所以各个线程之间互不影响,保证了线程安全。
在Spring中,很多状态Bean都是使用了ThreadLocal保证线程安全的。如: RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等有状态 bean。