Spring源码pt1——IoC

  • 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)
发布了17 篇原创文章 · 获赞 18 · 访问量 5563

猜你喜欢

转载自blog.csdn.net/Vincentqqqqqqq/article/details/104784042