天天看点

Spring系列(一):Spring是如何加载Bean的?

一、Spring容器有哪些?

  1. 单例池:是一个concurrentHashMap,key是beanName,value是object
  2. BeanFactory
  3. ApplicationContext:是BeanFactory的一种拓展
  4. AnotationConfigApplicationContext(不可刷新):以注解方式
  5. ClassPathXMLApplicationContext(可刷新):从项目的根路径开始查找文件
  6. FileSystemXMLApplicationContext(可刷新):从工程的根路径开始查找文件

二、创建Bean的方式有哪些?

  1. 使用xml文件中的标签 <bean/>
  2. 使用注解@Bean
  3. 使用@Component注解,配合@ComponentScan扫描
  4. 通过BeanDefinition
  5. 通过FactoryBean
  6. 通过Supplier

三、加载流程

  1. BeanDefinition定义
  2. 实例化前(InstantiationAwareBeanPostProcessor)
  3. 构造方法判断:如果构造方法没有加@Autowired注解,默认找无参;没有无参就找多个@Autowired(require=false)注解的构造方法,首先找形参最多的,形参数量一致就按从上到下
  4. 实例化
  5. 实例化后(InstantiationAwareBeanPostProcessor)
  6. 属性填充(@Autowired)
  7. 初始化前(BeanPostProcessor)
  8. 初始化(InitializingBean):对Bean中的其它属性赋值
  9. 初始化后(BeanPostProcessor):得到真正的bean对象,AOP就是在这个步骤做的