spring ioc

128 阅读3分钟

BeanFactory 定义如何获取

BeanDefinition 对业务bean进行抽象,内存中业务bean的存在形式

BeanDefinitionRegistry 负责bd的存储、注册

BeanDefinitionReader 负责从各种介质中加载

DefaultListableBeanFactory bf较为完整化的默认实现,可直接使用

FactoryBean 不好解释,产生bean的bean,不太好解释,主要用于对接第三方,相当于对bean嵌套了一层,增加了灵活性,不直接依赖第三方。

BeanDefinitionHolder 跟beanNameAware的实现相关,特别细节的功能,没太深入了解


生命周期

BeanPostProcessor bean的后置化处理,spring主要用来做啥操作? PropertyPlaceHolderConfigurer 主题是propertyConfigurer,针对placeholder占位符的。支持那种类似数据源的变量配置,用于把变量的值统一抽到一个配置文件来修改,符合开闭原则 PropertyOverrideConfigurer
CustomEditorConfigurer

PropertyEditor 上面3个都属于this,本身是jdk中rt.jar的概念 中文翻译是属性编译器,主要用来把各种不同介质中的不同格式的属性定义,转化为jvm中类的实例,起到一个转换作用

BeanWrapper 对bean进行一次包装,存在的意义暂时还不清楚,可能是对bean操作更简单?并且不影响bean本身

PropertyAccessor BeanWrapper继承它,细节没研究

TypeConvertor BeanWrapper继承它,细节没研究

*Aware (beanNameAware,ApplicationContextAware...) 后置处理

InitializingBean init-method

DisposableBean destory-method

Reader

PlaceHodler

Configurer

Registry

publisher

Editor

wrapper

convertor

Aware

Resolver

Holder


applicationContext

resource resourceLoader

reourcePatternResolver

pathMatchingReourcePatternResover

applicationEvent applicationListener applicationEventMulticaster

TaskExecutor


spring解决问题

之前自己需要自己new 对象,bean的复用啊,生命周期啊都要自己写代码维护,相对比较不方便。

有了spring,就把这一块(bean的维护)拿出来了,用一个框架去代为管理。

试想如果是你,做一个spring要考虑哪些问题? 答: 首先,要我写一个框架去管理bean,主要有以下几个功能必须实现:

  • 怎么获取bean的定义?
  • 怎么表示一个bean(都需要哪些属性,这里说的表示不只是bean内部的属性、方法问题,而是对bean的抽象(bean是对具体要解决问题的抽象,又叫面向对象),比如bean的全限定名,scope,dependson等
  • bean之间的依赖关系怎么处理(少量bean还好,多了的话,各种关系特别复杂;涉及继承、实例化的先后依赖等
  • bean的生命周期管理(从生到死,什么时候生,什么时候死,当然还有中间的一系列节点,预留钩子能够定制化做一些事情

除了对bean的加载、实例化,还有另外一半的工作需要处理,只有bean的实例化和维护,不能用到业务系统里,服务业务也是没什么用的。

所以还要考虑怎么在业务用到bean的时候给到业务代码,所以就要考虑:

  • 怎么定义业务代码需要bean
  • 识别到之后,怎么注入(一般来说就三种方法:构造方法注入,setter注入,接口注入,常用的就前两种