Spring的主心骨

2020-06-26  本文已影响0人  码而优则仕

Spring的主心骨

Bean&BeanDefinition

Bean是Spring中的一等公民

Spring会根据配置或注解生成用来描述Bean的BeanDefinition。

Java中Java对象是使用Class这个类来描述的,而在Spring则使用BeanDefinition来描述Bean

BeanDefinition常用的属性:

容器初始化要做的事情:

Spring中Bean的继承关系不是通过extends, implement 实现的,而是通过在BeanDefinition中设置parent属性来决定的。

RootBeanDefinition不能被设置为其他BeanDefinition的子属性,RootBeanDefinition可以承接两个BeanDefinition进行合并生成RootBeanDefinition合并除parent之外的所有属性。

Spring2.5之后使用GenericBeanDefinition来替代RootBeanDefinition和ChildBeanDefinition,但是由于之前一直使用RootBeanDefinition所以合并BeanDefinition还是使用的RootBeanDefinition。ChildBeanDefinition不能单独存在必须和RootBeanDefinition一起存在,ChildBeanDefinition已经被GenericBeanDefinition完全取代了。

GenericBeanDefinition通用的BeanDefinition

Spring容器都必须实现BeanFactory(顶级容器接口)接口

BeanFactory&FactoryBean

ListableBeanFactory

批量列出容器中实例的信息,如容器中Bean的名字,数量等

HierarchicalBeanFactory

使容器具有层次关系,查找当前容器的父级容器,判断Bean是否在当前容器中,只在当前容器中查找

AutowireCapableBeanFactory

使容器具有自动装配Bean的能力,根据类定义BeanDefinition去装配并执行前后处理器等

@Autowired注解实现自动装配最终就是调用这个类的如下方法实现的

Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;

ConfigurableBeanFactory

主要定义了设置父容器,容器类加载器,属性编辑器,容器通用的Bean后置处理器继承SingletonBeanRegistry 提供在运行期间向容器注册单例实例Bean的能力

ConfigurableListableBeanFactory

整合了BeanFactory体系的所有二级接口,忽略自动装配等10个方法

DefaultListableBeanFactory

真正第一个可以独立运行的IOC容器,继承AbstractAutowireCapableBeanFactory,实现集大成接口ConfigurableListableBeanFactory实现 BeanDefinitionRegistry 实现注册功能

一些术语讲解:

组件扫描:

自动发现应用容器中需要创建的Bean

自动装配:

Spring会自动满足Bean之间的依赖,

高级容器ApplicationContext

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
      MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

EnvironmentCapable:接口:用来获取Environment,获取容器的启动参数,如在启动main函数时设置的-Dparameter1=value1就可以通过返回的Environment实例获取到,也可以访问到Servlet的一些配置信息(如web.xml中配置的信息),如Environment实例的ConfigurableEnvironment

Environment extends PropertyResolver
public interface ConfigurableEnvironment extends Environment, ConfigurablePropertyResolver {
public interface ResourcePatternResolver extends ResourceLoader {

ApplicationEventPublisher使ApplicationContext具备事件发布的能力。

容器在启动的时候会给自身注册一些Listener,这些Listener会监听容器发布的事件,主要射击下面的监听类和事件类:

ApplicationEventMulticaster,ApplicationEvent

public interface EnvironmentCapable {

   /**
    * Return the {@link Environment} associated with this component.
    */
   Environment getEnvironment();

}

ApplicationContext常用容器

FileSystemXmlApplicationContext:从文件系统加载配置

ClassPathXmlApplicationContext:从ClassPath加载配置

XmlWebXmlApplicationContext:用于Web应用容器加载配置

基于注解的常用ApplicationContext容器:

AnnotationConfigServletWebServiceApplicationContext在SpringBoot模块中

AnnotationConfigReactiveWebServiceApplicationContext—响应式容器 在SpringBoot模块中

AnnotationConfigApplicationContext

以上具体容器实现都适用于不同场景,实现也不一样,下面主要研究他们的共性。

refresh()(可以看作是IOC容器的启动方法)大致功能:

ApplicationContext中的方法都是读取方法,所有功能都是配置的,所以需要ConfigurableApplicationContext接口支持,

AbstractApplicationContext类是Spring高级容器中最重要的类,实现了ConfigurableApplicationContext,

这个抽象类实现了Application接口中简单不易动的部分,主要是容器工厂的处理,如:事件发送广播,监听器注册,refersh方法,getBean方法,没实现的也预留了方法由子类实现。

这个类refresh方法使用了模版方法模式:—子类为父类提供支持

模版方法模式

围绕抽象类,实现通用逻辑,定义模版结构,部分逻辑由子类实现。

优点:

模版方法中有三类方法:

上一篇 下一篇

猜你喜欢

热点阅读