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管理。可以看作是一个小工厂
可以看到它就只有三个方法
- getObject() 获取对象
- isSingleton() 单例对象
- 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资源都可以
还有这三个重要的类👇,就不一一介绍先啦😄
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContext
- FileSystemXmlApplicationContext
IOC核心
IOC和DI就是核心了。大致的原理本猫基本理解,就是将Bean放到IOC中管理起来
引用----java4ye:
我们都知道 IOC 是 控制反转 ,但是别忘了 容器 这个词,比如 **容器的根接口 **BeanFactory ,容器的实现 👇
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContext
- FileSystemXmlApplicationContext
同时我们要注意这里无处不在的 后置处理器 xxxPostProcessor 🐷
这个是 Spring 中扩展性强的原因了!
原料在进入工厂时,经过一系列的后置处理器,处理他的方法,属性等。经过Beanfactory生产出Bean放到IOC


- 实例化 👉 Instantiation
- 初始化 👉 Initialization



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