20220823-今日分java随笔-spring学习

1,spring的整体脉络-跟着前辈走不吃亏--java4ye

抓重点:

  1,原理

  2,bean解析

  3,3个核心类:BeanFactory, FactoryBean,ApplicationContext

  4,IOC/DI

  5,Bean的生命周期

  6,AOP

在我们正常项目中对Spring的具体理解是真的不够深刻(个人感受),可能有些圈友们是半路出家,有些圈友们专业仅仅涉及软件行业但从事了软件行业(本猫就是),那不怕。慢慢的日积月累就可以。瘦猫还怕胖?本猫也是打算开始好好整理下,把鱼好好的收一下汁, 才会回味无穷。我的印象中,spring最核心的是IOC(控制反转),DI(依赖注入),AOP(了解,本猫也在学习中)。顺着前辈的经验简单梳理下今日所学。

  1,原理

    IOC = 工厂模式+xml+反射 DI,AOP,事务。因为现在基本都在用springboot,没有之前的那些繁琐的xml配置了,原理性的东西很少理解了

   2,spring的特点:

    1,轻量,一个简单的项目,才多大?

    2,扩展方便,看一下通过spring开发出的各种项目就知道

    3,IOC/DI,这个是核心,控制反转,依赖注入

    4,AOP,切面。教你如何找一个点去操作数据

    5,方便集成第三方,java的各式各样的第三方软件n多

 

                                                           源自-java4ye

    把spring想简单一点,它最主要的一点就是,来帮助我们管理我们的bean的

  2,看下spring是如何管理bean的

  

 

 

    原料:  

    没错,就是通过解析器,多我们的xml配置文件或者是注解进行解析,最后将这些信息封装到BeanDefinitaion中,并通过BeanDefinitionRedistey注册起来,放到beanDefinitionMap变量中,key:beanName,value:BeanDefinition

    BeanFinition的一些属性:

      beanClass: bean的类型,实例化时用

      scope: 作用范围有 singleton , prototype

      isLazy: 懒加载,true会在getBean的时候生成,且scope的prototype失效。false时,项目启动时加载

      initMethodName: 初始化方法,初始化时调用

      primary: 主要的,在有多个bean时使用

      dependsOn: 所依赖的Bean,必须等所有依赖Bean创建后才创建Bean

    BeanFinition就是生成Bean的原料,现在原料有的,下一步就是生成Bean

   反射:

    有了原料,BeanFactory如何生产Bean呢,就是反射

  

 

 

     简单看下BeanFactory

    它是IOC容器的根接口

 

 

 

 

  它主要提供这个getBean这个方法,以及别名获取,类获取等和其他一些判断,单例,多例,类型匹配,包含bean

       java4ye说,看源码,就看这个默认的接口,也就是带着Defult前缀的接口。大佬这么说本猫就跟着做了。

 

 

 DefaultListableBeanFactory,基本上根据名字就知道他是干嘛的了

  遍历Bean

HierarchicalBeanFactory, Hierarchical指层级关系
  也就是获取父子关系,获取上一级BeanFactory

ConfigurabalBeanFactory

  实现SingletonBenaFactory,主要是单例Bean的注册,生成

AutowireCapableBeanFactory

  和自动装配有关

AbstractBeanFactory

  单例缓存,以及 FactoryBean 相关的

ConfigurableListableBeanFactory

  预实例化单例Bean,分析,修改 BeanDefinition

AbstractAutowireCapableBeanFactory

  创建 Bean ,属性注入,实例化,调用初始化方法 等等

DefaultListableBeanFactory

  支持单例Bean ,Bean别名 ,父子BeanFactory,Bean 类型转化 ,Bean 后置处理,FactoryBean,自动装配等

本猫还灭理解所有的。慢慢去消化

 

FactoryBean

  FactoryBean它本身就是个Bean,归BeanFactory管理。可以看作是一个小工厂

 

  可以看到它就只有三个方法

    1.   getObject() 获取对象
    2.   isSingleton() 单例对象
    3.   getObjectType()  返回的是 Bean 对象的类型

  相比大工厂 BeanFactory 少了特别多东西,没有严格的 Bean 生命周期流程

   如何去区分Bean是由BeanFactory大工厂生产的,还是有FactoryBean生产的呢?其实很简单:

    1,FactoryBean本身也是Bean,是一个小工厂,生成另外的Bean

    2,BeanFactory是Spring容器的根接口,大工厂,成产各式各样的Bean

    3,beanName是正常deBean

    4,"&"+beanName,获取的是实现了BeanFactory的FactoryBean的工厂对象

 

 

 

  

  

 

ApplicationContext

  我们再来看看这个 ApplicationContext

 

 

 

  可以看到它扩展了很多功能,除了 BeanFactory ,它还可以创建 , 获取 Bean,以及处理国际化事件获取资源

    •   EnvironmentCapable  获取 环境变量 的功能,可以获取到 操作系统变量 和 JVM 环境变量
    •   ListableBeanFactory 获取所有 BeanNames,判断某个 BeanName 是否存在 BeanDefinition 对象,统计 BeanDefinition 对象,获取某个类型对应的所有 beanNames 等功能
    •   HierarchicalBeanFactory  获取父 BeanFactory ,判断某个 name 是否存在 bean 对象的功能
    •   MessageSource  国际化功能,获取某个国际化资源
    •   ApplicationEventPublisher 事件发布功能(重点)
    •   ResourcePatternResolver 加载,获取资源的功能,这里的资源可能是文件,图片 等某个URL资源都可以

  还有这三个重要的类👇,就不一一介绍先啦😄

    1.   ClassPathXmlApplicationContext
    2.   AnnotationConfigApplicationContext
    3.   FileSystemXmlApplicationContext

 IOC核心

  IOC和DI就是核心了。大致的原理本猫基本理解,就是将Bean放到IOC中管理起来

  引用----java4ye:

  我们都知道 IOC 是 控制反转  ,但是别忘了 容器 这个词,比如 **容器的根接口 **BeanFactory  ,容器的实现 👇

  1. ClassPathXmlApplicationContext
  2. AnnotationConfigApplicationContext
  3. FileSystemXmlApplicationContext

  同时我们要注意这里无处不在的 后置处理器  xxxPostProcessor 🐷

  这个是 Spring 中扩展性强的原因了!

 

 

 原料在进入工厂时,经过一系列的后置处理器,处理他的方法,属性等。经过Beanfactory生产出Bean放到IOC

BeanFactory 后置处理器
作为 IOC 容器根接口的 BeanFactory ,有着非常高的扩展性,比如最开始获取原料 BeanDefinition  时,就出现了两个针对 BeanFactory  工厂的后置处理器 👇
BeanDefinitionRegistryPostProcessor
通过该接口,我们可以自己掌控我们的 原料,通过 BeanDefinitionRegistry  接口去 新增,删除,获取我们这个 BeanDefinition
BeanFactoryPostProcessor
通过该接口,可以在 实例化对象前,对  BeanDefinition 进行修改 ,冻结 ,预实例化单例Bean 等
经过上面层层阻碍后,我们最终会来到目标方法 getBean ,将原料投入生产,最终获取一个个 Bean 对象出来
那么随之而来的就是这个 Bean 的生命周期啦 😄
Bean 生命周期
Bean 的创建和管理有标准化的流程!
这里在我们的工厂 BeanFactory 中写得很清楚 👇

 

 

总共 14 个步骤,是不是一下子就清晰多了😄

 

 

在看这部分的源码时,要多注意两个英文单词 😝
  1. 实例化 👉 Instantiation
  2. 初始化 👉 Initialization
ps: 别看快搞错了 哈哈😝
仔细阅读上面这14个步骤,会发现前面 8 个都是 Aware 接口,而他们的作用也很简单,就是获取 xxAware 这个单词的前缀 xx 😄
比如我们在上文 👉 《三分钟快速上手Spring事件机制》 中提到的事件发布器 ApplicationEventPublisher ,只要你实现了 ApplicationEventPublisherAware 接口,就可以获取 事件发布器 ApplicationEventPublisher  !
Bean 后置处理器
在实例化 和 初始化流程中,把这个Bean 的后置处理器 BeanPostProcessor 安排上,就得到下图啦 👇

 

 

这里留意下 实例化 有扩展点  InstantiationAwareBeanPostProcessor , 初始化 扩展点 BeanPostProcessor 就非常多啦,我们主要来关注下这个 AOP
AOP
那么 AOP 是在哪个步骤代理对象的呢?👇

 

 

可以在 AbstractAutoProxyCreator 类中看到 👇

 

 学习AOP后在学习这一扩展点

posted @ 2022-08-24 14:17  爱吃猫的鱼9527  阅读(10)  评论(0)    收藏  举报