Spring总共有十几个组件,但真正核心的只有三个:Core、Context和Bean。我们将从这三个组件入手来分析Spring。
Spring三个核心组件之间的关系
Spring之中最重要的当属Bean了,Spring实际上就是面向Bean的编程,Bean对于Spring的意义就好比Object对于OOP的意义一样。那么,三个核心组件之间是如何协同工作的呢?如果把Bean比作一场演出中的演员,那么Context就是这场演出的舞台,Core就是演出的道具,至于演出的节目,就是Spring的一系列特色功能了。
我们知道Bean包裹的是Object,而Object中必然有数据,Context就是给这些数据提供生存环境,发现每个Bean之间的关系,为他们建立并维护好这种关系。这样来说,Context就是一个Bean关系的集合,这个关系集合就是我们所说的IOC容器。那么Core又有什么作用呢?Core就是发现、建立和维护每个Bean之间的关系所需的一系列工具,就是我们经常说的Util。
Spring Beans(演员)
Bean 组件在 Spring 的 org.springframework.beans 包下。
这个包下的所有类主要解决了三件事:Bean 的定义、Bean 的创建以及对 Bean 的解析。
对 Spring 的使用者来说唯一需要关心的就是 Bean 的创建,其他两个由 Spring 在内部帮你完成了,对你来说是透明的。
bean定义
bean解析
Bean创建
SpringBean的创建时典型的工厂模式,其工厂的继承层次关系如图所示,BeanFactory为顶级接口。
在工厂模式中,在工厂的实现类中生成 Bean 返回给调用客户端,这就要求客户端提供生成自己所需类实例的工厂类,增加客户负担。Spring 结合控制反转和依赖注入为客户端提供所需的实例,简化了客户端的操作。从
BeanFactory的最终默认实现类是DefaultListableBeanFactory,他实现了所有的接口。
为什么要定义怎么多层次的接口呢?实际上,里面的每个接口都有他使用的场合,它主要是为了区分在Spring内部对象的传递和转化过程中,对对象的数据访问所做的限制。这些接口共同定义了Bean的集合、Bean之间的关系和Bean的行为。
BeanFactory接口
- BeanFactory是应用程序组件的中央仓库,保存了bean的定义及实例信息,是访问Bean的根接口。
- BeanFactory 在创建Bean时,会根据bean的scope属性值(Singleton(单例)、prototype(多例)),创建一个或多个实例。在Web环境下,scope的值还有request、session等值,表示bean的有效期。
- BeanFactory可以从任意位置(xml文件、properties文件、java代码)加载Bean的定义信息。
ListableBeanFactory 接口表示这些 Bean 是可列表的,而 HierarchicalBeanFactory 表示的是这些 Bean 是有继承关系的,也就是每个 Bean 有可能有父 Bean。AutowireCapableBeanFactory 接口定义 Bean 的自动装配规则。这四个接口共同定义了 Bean 的集合、Bean 之间的关系、以及 Bean 行为。
具体的实现方式大致如下。
public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory
implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {
/** Map of bean definition objects, keyed by bean name */
private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>;
public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition){
//...
}
}
beanDefinitionMap 作为具体的 Bean 容器,Spring 创建的对象实例保存其中。客户端需要时,使用工厂的 getBean 方法去试图得到相应的实例,如果实例已存在,则返回该实例;如果实例不存在,则首先产生相应实例并通过 registerBeanDefinition 方法将其保存在 beanDefinitionMap 中(Lazy Initialization),然后返回该实例给客户端。
Spring Bean 工厂的继承关系
pring 中的相关代码包是 org.springframework.beans
beanDefinitionMap 并不直接保存实例本身,而是将实例封装在 BeanDefinition 对象后进行保存。BeanDefinition 包含了实例的所有信息,其简化版的定义如下。
Bean生命周期
Bean的生命周期
Bean的创建
Bean的创建生命周期如下(参见BeanFactory接口)。并不是所有的实现类都会实现这些接口,但需要按照该顺序实现。
- BeanNameAware#setBeanName:设置bean的名称
- BeanClassLoaderAware#
setBeanClassLoader:设置bean的classloader
- BeanFactoryAware#
setBeanFactory:设置Bean的BeanFactory
- EnvironmentAware#
setEnvironment:设置环境,Environment保存了
- EmbeddedValueResolverAware#
setEmbeddedValueResolver(StringValueResolver resolver):用于注入Spring内置定义的字符串解析器(StringValueResolver是一个接口,定义了String resolveStringValue(String strVal方法))。@Value注解就是基于字符串解析器实现。
EmbeddedValueResolverAware接口参见
https://docs.spring.io/spring/docs/5.1.8.RELEASE/javadoc-api/org/springframework/context/EmbeddedValueResolverAware.html。- EmbeddedValueResolverAware用法
参见
https://blog.csdn.net/qq_28410283/article/details/90742940。 - org.springframework.beans.factory.config.PropertyPlaceholderConfigurer内部就是基于
https://www.cnblogs.com/happyflyingpig/p/11075641.html
- ResourceLoaderAware's
setResourceLoader
(only applicable when running in an application context): - ApplicationEventPublisherAware's
setApplicationEventPublisher
(only applicable when running in an application context) - MessageSourceAware's
setMessageSource
(only applicable when running in an application context) - ApplicationContextAware's
setApplicationContext
(only applicable when running in an application context) - ServletContextAware's
setServletContext
(only applicable when running in a web application context) postProcessBeforeInitialization
methods of BeanPostProcessors- InitializingBean's
afterPropertiesSet
- a custom init-method definition
postProcessAfterInitialization
methods of BeanPostProcessors
Bean的销毁
On shutdown of a bean factory, the following lifecycle methods apply:
postProcessBeforeDestruction
methods of DestructionAwareBeanPostProcessors- DisposableBean's
destroy
- a custom destroy-method definition
Spring Bean Factory
环境 Environment
Environment
Spring Context(舞台)
Spring Core(工具)
https://blog.csdn.net/weixin_40224981/article/details/89138734
https://blog.csdn.net/gutie_bartholomew/article/details/83005035
https://www.cnblogs.com/williamjie/p/9378646.html
https://blog.csdn.net/zlfprogram/article/details/75937935
https://baijiahao.baidu.com/s?id=1627793055199571550&wfr=spider&for=pc
https://blog.csdn.net/zlfprogram/article/details/75937935