单例池
- 单例Bean != Spring容器中只有一个该类型的Bean, 同一个类型的Bean可以通过命名不同的 id 来生成相同类型Bean
- 单例池 -> ConcurrentHashMap<String , Object> singletonObject -> 用单例池来存放单例Bean
BeanFactory
- 顾名思义, BeanFactory就是Bean工厂, 用于生成Bean
- 可以注册一个BeanDefinition也可以注册一个对象
- 还可以销毁一个Bean, 判断某个Bean是否存在等等
ApplicationContext
- ApplicationContext 与 BeanFactory区别
- ApplicationContext接口包括了BeanFactory的功能, 在此基础上还有其他的功能拓展, 比如获取环境变量, 国际化, 事件发布, 资源解析等
- Spring配置的展现形式
-
注解形式
- AnnotationConfigApplicationContext
- AnnotationConfigApplicationContext
-
XML形式
-
ClasspathXmlApplicationContext
-
FileSystemXmlApplicationContext
-
两者区别:
- ClasspathXmlApplicationContext会将classpath作为起始路径, FileSystemXmlApplicationContext将项目根目录作为起始路径, 且两者都支持绝对路径
-
-
- 是否可刷新
-
可刷新: ClasspathXmlApplicationContext
- 刷新会将当前容器中的bean对象全部销毁, 再重新加载配置文件对容器进行初始化, 生成bean对象, 如果在刷新过程中配置文件发生改变, 改变的部分也会生效
- 刷新前后得到的不是同一个对象
-
不可刷新: AnnotationConfigApplicationContext
-
Bean的生命周期
-
实例化前
- 实现该接口可在实例化前/后进行操作
- 若在实例化前返回了一个非空对象, 那么该对象就会被视为Bean对象, 之后的步骤除去初始化后其余步骤都不会进行
-
实例化
- 存在多个构造方法时, 如果没有特别指定, 会默认调用无参构造方法, 如果有特别指定(用@Autowired注解标记对应的构造方法) 则调用该构造方法, 如果多个构造方法标注@Autowired(required = true)则会报错, 如果构造方法都标注@Autowired(required = false)时, Spring会选择构造参数多的构造方法, 如果有多个构造参数个数相等的构造方法并且构造方法所需要的构造参数在容器中都能找到, Spring会选择最先定义的构造方法
-
实例化后
- 通过接口的返回值true/false 可以决定 Bean对象是否需要进行属性注入
-
属性填充
-
初始化前
- 需要实现BeanPostProcessor接口
- 初始化前方法返回null不会影响后续步骤执行, 但是其余的初始化前方法将不会被执行
- @PostConstruct注解同样可以对Bean对象的初始化前进行操作
-
初始化
- 实现该接口即可对Bean对象的初始化进行操作
-
初始化后
- 经过初始化后方法返回的对象是最后容器getBean()得到的Bean对象