Spring源码

在这里插入图片描述

Spring源码

BeanDefinition

BeanDefinition表示Bean定义,Spring根据BeanDefinition来创建Bean对象

属性

  • BeanClass

    • Bean的类型,创建bean时反射得到实例
  • Scope

    • Bean的作用域

      • singleton

        • 单例模式-默认作用域
      • prototype

        • 原型bean
  • isLazy

    • 懒加载,只针对singleton作用域

      • 懒加载时,第一次getBean时生成Bean
      • 或者Spring启动时直接生成bean
  • dependsOn

    • 表示一个Bean在创建前需要依赖其他的bean,需要依赖好的bean全部创建好后才会生成该bean
  • primary

    • 表示i一个Bean为主bean

      • 一个类型可以创建多个bean,进行依赖注入时,如果根据类型找到了多个bean,如果存在主bean,则注入主bean
  • initMethodName

    • bean的初始化方法

      • 对应bean生命周期中的初始化

应用

  • @Component
  • @Bean

BeanFactory

Spring 容器,Bean工厂

  • 创建获取bean

    • 通过BeanDefinition信息创建
  • 核心子接口和实现类

    • ListableBeanFactory

    • ConfigurableBeanFactory

    • AutowireCapableBeanFactory

    • AbstractFactory

    • DefaultListableBeanFactory

      • 支持单例Bean

      • 支持Bean别名

      • 支持父子BeanFactory

      • 支持Bean类型转化

      • 支持Bean后置处理

      • 支持FactoryBean

        • 一种创建bean的方式,实现接口getObject方法返回一个对象,这个对象就是最终的Bean对象。

        • 方法

          • getObject

            • 返回bean对象
          • isSingleton

            • 是否单例bean
          • getObjectType

            • bean对象的类型
        • BeanFactory

          • 大型工厂,spring容器,可以创建各种各样的bean
        • FactoryBean本身为一个bean,相当于小型工厂,可以生产出另外的bean,俩者相当于抽象工厂模式

      • 支持自动装配

ApplicationContext

比BanFactory更强大的容器,

创建bean

获取bean

支持国际化、事件广播、获取资源等BeanFactory不具备的功能

继承的接口

  • EnviromentCapable

    • 获取操作系统环境变量和JVM环境变量
  • ListableBeanFactory

    • 获取所有beanNames
    • 判断某个beanName是否存在beanDefinitionn
    • 统计beanDefinition个数
    • 获取某个类型对应的所有BeanNames
  • MessageSource

    • 国际化功能,例如不同国家语言所对应的字符
  • HierarchicaBeanFactory

    • 获取父BeanFactory
    • 判断某个name是否存在bean对象
  • ApplicationEventPublisher

    • 发布事件
  • ResourcePatternResolver

    • 加载并获取资源(图片、文件、url)

Bean生命周期

bean从创建到销毁经历的步骤

  • 1.BeanDefinition-Bean定义

  • 2.构造方法推断,选出一个构造方法

  • 3.通过构造方法实例化

    • 通过BeanPostProcessor机制,对实例化进行干预
  • 4.属性填充,给实例对象属性进行自动填充

    • @AutoWired

      • 表示某个属性是否需要依赖注入,默认为required

      • 注入流程

        • 1.先根据属性的类型查找Bean对象
        • 2.根据类型找到多个bean,在根据属性名进行筛选;
        • 3.requried为true时,未找到bean则抛出异常
      • 注解在方法上时

        • 对方法参数进行注入
        • 自动反射调用该方法
      • 注解在构造方法上时

        • 构造方法推断阶段使用该构造方法,实例化之前先获取容器中构造方法参数的Bean对象,用于入参
    • @Resource

      • name属性是否有值,注入流程不一样

        • name有值

          • 根据name查找bean对象
          • 没找到则抛出异常
        • name无值

          • 1.根据属性名称查找bean对象
          • 2.根据属性类型查找bean对象
      • java原生提供

    • @Value

      • 获取properities文件值
      • 解析SpEl表达式
  • 5.初始化,对其他属性赋值和校验

    • 可以利用InitializingBean接口对bean中的其他属性赋值和加工、校验等等
  • 6.初始化后,AOP,生成代理对象

    • AOP机制通过BeanPostProcessor实现,初始化后结束的对象才是真正的Bean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值