天天看點

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就是在這個步驟做的