美文网首页
Spring的主心骨

Spring的主心骨

作者: 码而优则仕 | 来源:发表于2020-06-26 15:11 被阅读0次

Spring的主心骨

  • 解析配置

  • 定位与注册对象

  • 注入对象

Bean&BeanDefinition

Bean是Spring中的一等公民

  • Bean的本质就是Java对象,只是这个Java对象的生命周期由Spring容器来管理和维护
  • 不需要为了创建Bean而在原来的Java对象上添加任何额外的限制
  • 对Java对象的控制方式体现在配置上或注解上

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

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

BeanDefinition常用的属性:

  • 作用范围scope

    Singleton,prototype, session,request等

  • 懒加载 lazy-init

  • 首选primary,设置为true的Bean会是优先的实现类

  • Factory-bean(工厂bean的名称),factory-method(工厂方法的名称)

容器初始化要做的事情:

  • 将XML或注解读入到内存
  • 内存中注解或配置文件会被当作Resource对象
  • 解析成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

  • BeanFactory

    是Spring IOC容器的根接口,定义Bean工厂的最基本特性,如获取Bean;用于管理Bean

  • FactoryBean

    该接口的getObject方法用户可以使用一套复杂的逻辑生成Bean,FactoryBean本质也是一个Bean,但是这个Bean不是用来注入其他地方进行使用的(不像Service,Dao,Controller),而是用于生成普通Bean;对于实现了这个接口的Bean,Spring容器在初始化的时候会取出这些Bean,调用getObject()方法生成我们想要的Bean。

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容器的启动方法)大致功能:

  • 容器初始化,配置解析
  • BeanPostProcessor和BeanFactoryPostProcessor的注册与激活
  • 国际化配置初始化

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

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

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

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

模版方法模式

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

优点:

  • 复用代码,反向控制

模版方法中有三类方法:

  • 具体公用方法基类实现,
  • 抽象方法必须子类实现,
  • 钩子方法预留的方法子类可以选择性的实现。

相关文章

  • Spring的主心骨

    Spring的主心骨 解析配置 定位与注册对象 注入对象 Bean&BeanDefinition Bean是Spr...

  • 主心骨

    爱好是一个人在活着的时候除了生存的基本技能外应该拥有的美好事物。每个人的爱好都不同,有的人将自己的爱好当做一个放空...

  • 主心骨

  • 主心骨

    最近这几周工作很忙,忙到爆炸那种。因为要准备WCM审核,再加上又要准备CCC审核,最最重要的是我是一个晚睡晚起的人...

  • 主心骨

    做人,得有自己的主心骨。 莫要将希望寄托在别人身上 要有自己的考量和打算

  • 主心骨

    近段时间追革命电视剧,说到一个词语:主心骨!作为一个男人,我能成为主心骨吗?感觉我不是,但又必须是!至少我必须成为...

  • 主心骨

    2019年7月18日,申报项目的一天。 这几天锻炼比较少,有点辜负了西安的夏天。 忙完一天的工作,回来没有食欲,在...

  • 主心骨

    一直以來我是個沒有“主心骨”的男兒,心裏特別的脆弱,沒有一股硬氣。所以我活的很窩囊,別人怎麼說我罵我都不會...

  • 主心骨

    我是农村小女人,今天我要讲述的是一个家庭中的主要人物,也就是所谓的"主心骨"。 相信很多人第一反应就是家里的男人,...

  • 主心骨

    有人笑说我是骗假的,我也觉得是。 前天,如果不是腰酸背痛得与平时特别不同,如果不是同学随口问发烧没,如果不是好奇去...

网友评论

      本文标题:Spring的主心骨

      本文链接:https://www.haomeiwen.com/subject/zbhufktx.html