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