[Spring 源码学习]
BeanDefinition
@component,@bean, 这些都会被解析为 BeanDefinition对象。
BeanFactory
BeanFactory 将利用BeanDefinition来生成Bean对象。
BeanDefinition 相当于BeanFactory的原材料。
Bean对象相当于BeanFactory所生产出来的产品。
BeanFactory的核心子接口和实现类
ListableBeanFactory,ConfigurableBeanFactory,AutowireCapableBeanFactory,
AbstractBeanFactory,DefaultListableBeanFactory.
Bean生命周期
Bean生命周期描述的是Spring中的一个Bean创建过程和销毁过程中所经历的步骤,其中Bean创建过程是重点。
程序员可以利用Bean生命周期机制对Bean进行自定义加工。
- BeanDefinition对象构建
- 构造方法推断(选出一个构造方法)
- 实例化:构造方法反射得到对象。
- 属性填充:给属性进行自动填充。
- 初始化:对其他属性赋值,校验。
- 初始化后AOP,生成代理对象。
依赖注入相关
1.注入方式:
- @Autowired
- @value
- @Resource
- @Inject
- BeanDefinition
2.@AutoWired:
可以用来标注在:
- 属性
- 构造方法
- set方法
其查询方式粗略可以分为:
- 查询类别: byType
- 查询名字: byName
易错点:
- 单例池与单例模式的不同:
单例池中,并不是相同类型的对象只有一个,而是相同姓名的相同类型的对象只有一个,而单例模式是,一个类别对应的对象有且只有一个。 - @Value中的#与$:
- $:有一个Environment 类来存储:操作系统,JVM环境(-D),xx.propreties 来用KEY:VALUE 的形式存储这些环境变量。
- #: Spring 解析到@Value 时,会将其后的字符串当做表达式来处理。(这块还是不是特别清楚)。
3.@Resource
- @Resource注解与@Autowired类似,也是用来进行依赖注入的,@Resource是JAVA层面提供的注解,@Autowired是Spring所提供的注解。他们依赖注入的底层实现逻辑也不同。
- @ReSource 注解中有一个name属性,针对name属性是否有值,@resource的依赖注入底层流程是不同的。
- @reSource,name属性有值,那么Spring会直接根据所指定的name值取Spring容器中找Bean对象,如果找到了则成功,如果没找到,则报错。
- 如果name属性没有值,则:
- 先判断该属性名字在Spring容器中是否存在对象。
- 如果存在,则成功找到BEAN对象进行注入。
- 如果不存在,根据属性类型去容器中找BEAN对象,找到一个则注入。
4.@value
- @Value 注解和@RESOURCE和@AUTOWIRED类似,也是用来对属性进行依赖注入的,只不过是@Valued是用来从Properties文件中来获取值,并且@Value可以解析SpEL(Spring表达式)。
ApplicationContext
ApprlicationContext:是比BeanFactory更加强大的Spring容器,它既可以创建bean,获取bean,还支持国际化,事件传播,获取资源等BeanFactory不具备的功能。
AOP
AOP工作原理:
- Spring生成Bean对象时,先实例化出来一个对象,也就是target对象。
- 再对target对象进行属性填充。
- 在初始化后步骤中,会判断target对象有没有对应的切面。
- 如果有切面,就表示当前target对象需要AOP.
- 通过CGLIB或动态代理的机制生成一个代理对象,作为最终的Bean对象。
- 代理对象中有一个target属性指向了target对象。