一、Spring容器有哪些?
- 单例池:是一个concurrentHashMap,key是beanName,value是object
- BeanFactory
- ApplicationContext:是BeanFactory的一种拓展
- AnotationConfigApplicationContext(不可刷新):以注解方式
- ClassPathXMLApplicationContext(可刷新):从项目的根路径开始查找文件
- FileSystemXMLApplicationContext(可刷新):从工程的根路径开始查找文件
二、创建Bean的方式有哪些?
- 使用xml文件中的标签 <bean/>
- 使用注解@Bean
- 使用@Component注解,配合@ComponentScan扫描
- 通过BeanDefinition
- 通过FactoryBean
- 通过Supplier
三、加载流程
- BeanDefinition定义
- 实例化前(InstantiationAwareBeanPostProcessor)
- 构造方法判断:如果构造方法没有加@Autowired注解,默认找无参;没有无参就找多个@Autowired(require=false)注解的构造方法,首先找形参最多的,形参数量一致就按从上到下
- 实例化
- 实例化后(InstantiationAwareBeanPostProcessor)
- 属性填充(@Autowired)
- 初始化前(BeanPostProcessor)
- 初始化(InitializingBean):对Bean中的其它属性赋值
- 初始化后(BeanPostProcessor):得到真正的bean对象,AOP就是在这个步骤做的