Spring Context Utils 获取上下文中的 bean
在使用多线程环境时,有些对象不是拖管在 Spring 容器中,但需要拿到 Bean 资源,是无法通过注入的方式的,就需要通过外部工具类来获取 Spring 上下文,再获取 Bean。
在使用多线程环境时,有些对象不是拖管在 Spring 容器中,但需要拿到 Bean 资源,是无法通过注入的方式的,就需要通过外部工具类来获取 Spring 上下文,再获取 Bean。
Spring 项目经常需要拿到上下文,通过上下文来获取 IoC 容器中注册的 Bean。
获取上下文有好几种方式,可以实现 ApplicationContextAware 接口,可以通过 ServletContext 获取,而通过 ContextLoader 来获取上下文在 Spring Boot 中并不适用,适用于 Spring 项目。
Spring提供了强大的注解功能,有部分注解是以@Enable*
开头的,表示开启某项功能,本文汇总下此类注解。
AspectJ
自动代理的支持。@ConfigurationProperties
注解配置Bean
的支持。Spring Data JPA Repository
的支持。Spring 中的默认为所有申明为 Bean
的对象创建一个实例存放到IoC
容器进行管理的,这些Bean
对象对于多线程来说是共享的,所以严格来说 Spring Bean 是非线程安全的。Spring 本身就没有对 bean 的多线程安全问题做出任何保证与措施。
使用 Spring 框架,在定义 Bean 时,通常不指定其作用范围而使用默认的配置,可能会对 Spring Bean 的作用范围不甚了解。Spring 给 Bean 定义的作用范围提供了灵活的配置,开箱即用,Spring Framework 支持 六个作用范围,其中四个范围只有在使用支持 Web 的 ApplicationContext时才能使用,还提供了自定义作用范围。
查看了下 Spring 5.0.9 Release 版本关于 Spring Bean scopes章节内容,在此做个记录,至于是否和其它版本有区别暂未对比。
Spring Bean的生命周期由多个特定的生命队段组成,可以从两个层面来定义Bean的生命周期。第一层是Bean的作用范围;第二层是实例化Bean所经历的一系列阶段。
Spring 将 Bean 注册到的 IoC 容器方式主要有XML配置文件方式、JavaConfig方式、注解方式这三种。
Spring Bean在使用之前或使用之后需要做一些操作,Spring对Bean
的生命周期的操作提供了支持。
项目中,当需要用到Spring容器本身的功能资源时,Bean就需要知道容器的存在,才能调用 Spring 所提供的资源,而 Spring Aware就是提供这样的功能,原本也是给 Spring 框架内部使用的。
Spring Aware 的目的就是为了让 Bean 获取容器的服务。ApplicationContext
接口集成了MessageSource
接口,ApplicationEventPublisher
接口和ResourceLoader
接口,如果让 Bean 继承 ApplicationContextAware
可以获得 Spring 容器的所有服务,但原则上有用到什么接口,再实现该接口。
一个 Web
项目的Socket
需用到多线程,每一个连接创建一条线程来处理数据。
在多线程中需要用到 Spring
中的 Bean
,如果直接用 Spring 注入是会报NullPointerException
错误。原因是线程类无法提前委托给Spring
管理,是在使用中创建的。