- BeanDefinition
- BeanFactory
- BeanDefinition、BeanFactory、Bean对象之间的关系
- BeanFactory的核心子接口
- DefaultListableBeanFactory 功能
- Bean生命周期
- @Autowired是什么
- @Resource是什么
- @Value是什么
- FactoryBean是什么
- ApplicationContext是什么
BeanDefinition表示Bean定义,Spring根据BeanDefinition来创建Bean对象,BeanDefinition有很多的属性用来描述Bean,BeanDefinition是Spring中非常核心的概念。
BeanFactoryBeanFactory是一种“Spring容器”,BeanFactory就是Bean工厂,顾名思义,它可以用来创建Bean,获取Bean,BeanFactory是Spring中非常核心的组件。
BeanDefinition、BeanFactory、Bean对象之间的关系BeanFactory将利用BeanDefinition来生成Bean对象,BeanDefinition相当于BeanFactory的原材料,Bean对象就相当于BeanFactory所生产出来的产品。
BeanFactory的核心子接口 DefaultListableBeanFactory 功能支持单例Bean、支持Bean别名、支持父子BeanFactory、支持Bean类型转化、支持Bean后置处理、支持FactoryBean、支持自动装配,等等
Bean生命周期Bean生命周期描述的是Spring中一个Bean创建过程和销毁过程中所经历的步骤,其中Bean创建过程是重点。
我们开发者可以利用Bean生命周期机制对Bean进行自定义加工。
大致顺序:
---- BeanDefinition 进行Bean的定义
---- 构造方式推断 选出一个构造方法
---- 实例化 构造方法反射得到对象
---- 属性填充 给属性进行自动填充
---- 初始化 对其他属性复制、校验
---- 初始化后 AOP、生成代理对象
BeanDefinition
BeanDefinition表示Bean定义,它定义了某个Bean的类型,Spring就是利用BeanDefinition来创建Bean的,比如需要利用BeanDefinition中beanClass属性确定Bean的类型,从而实例化出来对象。
构造方式推断
一个Bean中可以有多个构造方法,此时就需要Spring来判断到底是用哪个构造方法,这个过程是比较复杂的(后续完善补充)。通过构造方法推断之后确定一个构造方法之后,就可以利用构造方法实例化得到一个对象了。
实例化
通过构造方法反射得到一个实例化对象,在Spring中,可以通过BeanPostProcessor机制对实例化进行干预。
属性填充
实例化所得到的对象,是“不完整”的对象,“不完整”的意思是该对象中的某些属性还没有进行属性填充,也就是Spring还没有自动给某些属性赋值,属性填充就是我们通常说的自动注入,依赖注入。
初始化
在一个对象的属性填充之后,Spring提供了初始化机制,我们开发者可以利用初始化机制对Bean进行自定义加工,比如可以利用InitializingBean接口来对Bean中的其他属性进行赋值,或者对Bean中的某些属性进行校验。
初始化后
初始化后是Bean创建生命周期中的最后一个步骤,我们常说的AOP机制,就是在这个步骤中通过BeanPostProcessor机制实现的,初始化之后得到的对象才是真正的Bean对象。
@Autowired表示某个属性是否需要进行依赖注入,可以卸载属性和方法上。注解中的required属性值默认为true,表示如果没有对象可以注入给属性则抛出异常。
@Autowired加在某个属性上,Spring在进行Bean的生命周期过程中,在属性填充这一步,会基于实例化出来的对象,对该对象中加了@Aotuwired的属性自动给属性赋值。
Spring会先根据属性的类型去Spring容器中找出该类型所有的Bean对象,如果找出来多个,则再根据属性的名字从多个中确定一个。如果required值为true,并且根据属性信息找不到对象,则抛出异常。
当@Autowired注解写在某个方法上时,Spring在Bean生命周期的属性填充阶段,会根据方法的参数类型、参数名字从Spring容器找到对象当做方法入参,自动反射调用该方法。
@Autowired加在构造方法上时,Spring会在推断构造方法阶段,选择该构造方法来进行实例化,在反射调用构造方法之前,会先根据构造方法参数类型,参数名从Spring容器中找到Bean对象,当做构造方法入参。
@Resource是什么@Resource注解与@Autowired类似,也是用来进行依赖注入的,@Resource是Java层面所提供的注解,@Autowired是Spring所提供的注解,他们依赖注入的底层实现也逻辑不同。
@Resource注解中有一个name属性,针对name属性是否有值,@Resource的依赖注入底层流程是不同的。
@Resource如果name属性有值,那么Spring会直接根据所制定的name值去Spring容器中找Bean对象,如果找到了则成功,没有找到,则报错。
如果@Resource中的name属性没有值,则:
1.先判断该属性名字在Spring容器中是否存在对象。
2.如果存在,则成功找到Bean对象进行注入。
3.如果不存在,则根据属性类型去Spring容器找Bean对象,找到一个则进行注入。
@Value注解和@Resource、@Autowired类似,也是用来对属性进行依赖注入的,只不过@Value是用来从Properties文件中来获取值的,并且@Value可以解析SpEL(Spring表达式)。
@Value(“yck”)
直接将字符串“yck”赋值给属性,如果属性类型不是String,或无法进行类型转化,则报错。
@Value(“$ {yck}”)
将会把${}中的字符串当做key,从Properties文件中找出对应的value赋值给属性
@Value(“#{yck}”)
会将#{}中的字符串当做Spring表达式进行解析,Spring会把"yck"当做beanName,并从Spring容器中找对一个bean,如果找到则进行属性注入,没找到则报错。
FactoryBean是Spring所提供的一种较灵活的创建Bean的方式,可以通过实现FactoryBean接口中的getObject()方法来返回一个对象,这个对象就是最终的Bean对象。
FactoryBean接口中的方法
Object getObject(): 返回的是Bean对象
boolean isSingleton(): 返回的是否是单例Bean对象
Class getObjectType(): 返回的是Bean对象的类型
FactoryBean对象本身也是一个Bean,同时它相当于一个小型工厂,可以生产出另外的Bean。
BeanFactory是一个Spring容器,是一个大型工厂,它可以生产出各种各样的Bean。
FactoryBean机制被广泛的应用在Spring内部和Spring与第三方框架或组件的整合过程中。
ApplicationContext是什么ApplicationContext是比BeanFactory更加强大的Spring容器,它既可以创建bean、获取bean,还支持国际化、事件传播、获取资源等BeanFactory不具备的功能。
TODO



