【Spring】源码学习-基础概念学习

Source

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进行自定义加工。

  1. BeanDefinition对象构建
  2. 构造方法推断(选出一个构造方法)
  3. 实例化:构造方法反射得到对象。
  4. 属性填充:给属性进行自动填充。
  5. 初始化:对其他属性赋值,校验。
  6. 初始化后AOP,生成代理对象。

依赖注入相关

1.注入方式:

  • @Autowired
  • @value
  • @Resource
  • @Inject
  • BeanDefinition

2.@AutoWired:
可以用来标注在:

  • 属性
  • 构造方法
  • set方法

其查询方式粗略可以分为:

  • 查询类别: byType
  • 查询名字: byName

易错点:

  • 单例池与单例模式的不同:
    单例池中,并不是相同类型的对象只有一个,而是相同姓名的相同类型的对象只有一个,而单例模式是,一个类别对应的对象有且只有一个。
  • @Value中的#与$:
    • $:有一个Environment 类来存储:操作系统,JVM环境(-D),xx.propreties 来用KEY:VALUE 的形式存储这些环境变量。
    • #: Spring 解析到@Value 时,会将其后的字符串当做表达式来处理。(这块还是不是特别清楚)。

3.@Resource

  1. @Resource注解与@Autowired类似,也是用来进行依赖注入的,@Resource是JAVA层面提供的注解,@Autowired是Spring所提供的注解。他们依赖注入的底层实现逻辑也不同。
  2. @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工作原理:

  1. Spring生成Bean对象时,先实例化出来一个对象,也就是target对象。
  2. 再对target对象进行属性填充。
  3. 在初始化后步骤中,会判断target对象有没有对应的切面。
  4. 如果有切面,就表示当前target对象需要AOP.
  5. 通过CGLIB或动态代理的机制生成一个代理对象,作为最终的Bean对象。
  6. 代理对象中有一个target属性指向了target对象。