- Spring广义来讲是一个大项目,有framework、boot、cloud、data…
- 狭义讲:是springframework框架,具体如下:
注意⚠️
如果仅仅开发ioc、aop,那么什么spring-core、spring-aop…都是不需要的。仅仅一个spring-context就够了。
2.Spring bean生命周期
源码链:
MyTest
new AnnotationConfigApplicationContext(Config.class);
AnnotationConfigApplicationContext
public AnnotationConfigApplicationContext(Class<?>… componentClasses) {
this(); // 调用无参构造方法,beanfactory
register(componentClasses);
refresh();‼️最重要的方法
}
AnnotationConfigApplicationContext
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
GenericApplicationContext
public GenericApplicationContext() {
this.beanFactory = new DefaultListableBeanFactory();
}
AbstractApplicationContext
@Override
public void refresh() throws BeansException, IllegalStateException {
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
invokeBeanFactoryPostProcessors(beanFactory);
finishBeanFactoryInitialization(beanFactory);
AbstractApplicationContext
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
AbstractBeanFactory
@Override
public Object getBean(String name, Object… args) throws BeansException {
return doGetBean(name, null, args, false);
}
AbstractBeanFactory
protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType,
@Nullable final Object[] args, boolean typeCheckOnly) throws BeansException {
return createBean(beanName, mbd, args);
AbstractAutowireCapableBeanFactory
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
AbstractAutowireCapableBeanFactory
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
instanceWrapper = createBeanInstance(beanName, mbd, args);
exposedObject = initializeBean(beanName, exposedObject, mbd);
AbstractAutowireCapableBeanFactory
protected Object initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
- ⚠️把spring工厂就认为是DefaultListableBeanFactory,DefinitionReader
引用DefaultListableBeanFactory,DefinitionReader加载资源。 - ⚠️refresh();‼️是整个Spring中最重要的方法。没有之一
- ⚠️工厂后处理器,就是Spring邀请你参与到bean管理的工作中来的邀请函。
- ⚠️工厂后处理器可以程序员自定义,Spring也很多有自带的。它们全部都在refresh()的invokeBeanFactoryPostProcessors中被调用。
- ⚠️工厂后处理器自定义的话,实现BeanFactoryPostProcessor,他会给你一个beanFactory,给你一座工厂!你想干啥干啥
全貌:
全貌:
finishBeanFactoryInitialization(beanFactory) :
FactoryBean、BeanFactory
FactoryBean就是一个特殊bean
⚠️bean和对象是两回事,bean比对象多了很多东西,比如aop、lifecyclecallback、autowire还有其他spring bean生命周期的东西、属性…
⚠️所以,在spring bean生命周期中,bean是先被构造函数new出来成为一个普普通通对象,再继续经过额外处理才成为一个bean的。(这一微观过程,在finishBeanFactoryInitialization(beanFactory) 中发生)
Spring面对bean有循环依赖,比如相互autowird的时候,会存在中间过程(也就是从new出来,到成为真正bean这一过程)。(按理说会有死循环)
如果bean A正在创建中,那么表明它已经是一个对象了,那就可以跳出死循环。
-
Spring是支持循环依赖的,前提是bean是单例的。prototype是不行的。
-
所以现在可以明白,为什么Spring的核心是BeanFactory和ApplicationContext了。BeanFactory接口就是负责生产bean、它规定了所有实现BeanFactory的;类生产bean的规范,但是具体怎么生产、需要哪些条件、限制他都不管,而且他职责就是只生产bean。那么ApplicationContext接口就是BeanFactory的扩充,它不仅具有BeanFactory的功能,还增加了比如ResourceLoader、EventPublisher…众多完备的功能规范,让bean的生产过程完整。所以ApplicationContext就是整个Spring容器、上下文、Spring的全部。
-
常用的BeanFactory就是defaultlistablefactorybean
- 主要他有成员:
- beandefinitionmap
- 它还实现了BeanDefinitionRegistry的接口
- 主要他有成员:
-
DefaultSingletonBeanRegistry有一个成员singletonObjects,就是容器的单例池
-
常用的ApplicationContext就是AbstractapplicApplicationContext、Generic ApplicationContext。
- 它重要的方法就是refresh()
- invokebeanfactorypostprocessor(beanfactory)
- finishbeanfactoryinitializer(beanfactory)
- 它重要的方法就是refresh()