栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

深入SpringBoot源码(十二)ApplicationContext与BeanFactory的创建

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

深入SpringBoot源码(十二)ApplicationContext与BeanFactory的创建


SpringApplication的createApplicationContext是用于创建ApplicationContext的策略方法。默认情况下,此方法将尊重任何显式设置的应用程序上下文类或工厂,然后再回退到合适的默认值。此方法返回的应用程序上下文是尚未刷新的。

	private ApplicationContextFactory applicationContextFactory = ApplicationContextFactory.DEFAULT;

	protected ConfigurableApplicationContext createApplicationContext() {
		return this.applicationContextFactory.create(this.webApplicationType);
	}

ApplicationContextFactory是用于创建SpringApplication使用的ConfigurableApplicationContext的策略接口(是一个函数式接口)。创建的上下文应该以其默认形式返回, SpringApplication负责配置和刷新上下文。

@FunctionalInterface
public interface ApplicationContextFactory {

	
	ApplicationContextFactory DEFAULT = (webApplicationType) -> {
		try {
			switch (webApplicationType) {
			case SERVLET:
				return new AnnotationConfigServletWebServerApplicationContext();
			case REACTIVE:
				return new AnnotationConfigReactiveWebServerApplicationContext();
			default:
				return new AnnotationConfigApplicationContext();
			}
		}
		catch (Exception ex) {
			throw new IllegalStateException("Unable create a default ApplicationContext instance, "
					+ "you may need a custom ApplicationContextFactory", ex);
		}
	};

	
	ConfigurableApplicationContext create(WebApplicationType webApplicationType);

	
	static ApplicationContextFactory ofContextClass(Class contextClass) {
		return of(() -> BeanUtils.instantiateClass(contextClass));
	}

	
	static ApplicationContextFactory of(Supplier supplier) {
		return (webApplicationType) -> supplier.get();
	}

}

由于我的应用引入了spring-boot-starter-webflux,所以在调用ApplicationContextFactory的create方法时传入的webApplicationType为REACTIVE,返回的是AnnotationConfigReactiveWebServerApplicationContext实例。

public interface ApplicationStartup {

	
	ApplicationStartup DEFAULT = new DefaultApplicationStartup();

	
	StartupStep start(String name);

}

createApplicationContext方法执行完毕后,接着调用AnnotationConfigReactiveWebServerApplicationContext的setApplicationStartup方法,由于AnnotationConfigReactiveWebServerApplicationContext本身不重写该方法,所以调用的是GenericApplicationContext的setApplicationStartup方法。

GenericApplicationContext的setApplicationStartup方法:

	private final DefaultListableBeanFactory beanFactory;

	public void setApplicationStartup(ApplicationStartup applicationStartup) {
		super.setApplicationStartup(applicationStartup);
		this.beanFactory.setApplicationStartup(applicationStartup);
	}

最终赋值给了AbstractApplicationContext的成员字段applicationStartup。

GenericApplicationContext的setApplicationStartup方法还有一段代码是调用其成员字段beanFactory的setApplicationStartup方法。

beanFactory是DefaultListableBeanFactory的实例。SpringApplication的createApplicationContext是通过创建GenericApplicationContext的无参构造方法创建AnnotationConfigReactiveWebServerApplicationContext的。

	public GenericApplicationContext() {
		this.beanFactory = new DefaultListableBeanFactory();
	}

DefaultListableBeanFactory是Spring的ConfigurableListableBeanFactory和BeanDefinitionRegistry接口的默认实现,是一个基于 bean 定义元数据的成熟 bean 工厂,可通过后处理器进行扩展。典型用法是在访问 bean 之前首先注册所有 bean 定义(可能从 bean 定义文件中读取,按名称查找Bean是本地bean定义表中的一种低成本操作,它对预先解析的bean定义元数据对象进行操作。)。
DefaultListableBeanFactory的层次性关系:

DefaultListableBeanFactory的无参构造器:

	public DefaultListableBeanFactory() {
		super();
	}

AbstractAutowireCapableBeanFactory是实现默认bean创建的抽象bean工厂超类,具有RootBeanDefinition类指定的全部功能。除了 AbstractBeanFactory的createBean方法外,还实现了AutowireCapableBeanFactory接口。AbstractAutowireCapableBeanFactory提供 bean 创建(使用构造函数解析)、属性填充、连接(包括自动连接)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。AbstractAutowireCapableBeanFactory支持自动装配构造函数、按名称的属性和按类型的属性(其子类要实现的主要模板方法是resolveDependency(DependencyDescriptor, String, Set, TypeConverter) ,用于按类型自动装配。如果工厂能够搜索其bean定义,匹配的 bean通常将通过这样的搜索来实现。对于其他工厂风格,可以实现简化的匹配算法)。AbstractAutowireCapableBeanFactory的无参构造器:

	public AbstractAutowireCapableBeanFactory() {
		super();
		ignoreDependencyInterface(BeanNameAware.class);
		ignoreDependencyInterface(BeanFactoryAware.class);
		ignoreDependencyInterface(BeanClassLoaderAware.class);
		if (NativeDetector.inNativeImage()) {
			this.instantiationStrategy = new SimpleInstantiationStrategy();
		}
		else {
			this.instantiationStrategy = new CglibSubclassingInstantiationStrategy();
		}
	}
	
	
	private InstantiationStrategy instantiationStrategy;

	
	private final Set> ignoredDependencyInterfaces = new HashSet<>();

	
	public void ignoreDependencyInterface(Class ifc) {
		this.ignoredDependencyInterfaces.add(ifc);
	}
public abstract class NativeDetector {

	// See https://github.com/oracle/graal/blob/master/sdk/src/org.graalvm.nativeimage/src/org/graalvm/nativeimage/ImageInfo.java
	private static final boolean imageCode = (System.getProperty("org.graalvm.nativeimage.imagecode") != null);

	
	public static boolean inNativeImage() {
		return imageCode;
	}
}

AbstractBeanFactory是BeanFactory实现的抽象基类,提供ConfigurableBeanFactory SPI的全部功能。AbstractBeanFactory可以用作bean 工厂实现的基类,它从一些后端资源获取bean定义(其中bean定义访问是一项昂贵的操作)。此类提供单例缓存(通过其基类DefaultSingletonBeanRegistry、单例/原型确定、FactoryBean处理、别名、合并子bean定义的bean定义和bean销毁(通过org.springframework.beans.factory.DisposableBean接口,自定义销毁方法)。此外,它可以通过实现org.springframework.beans.factory.HierarchicalBeanFactory接口来管理bean工厂层次结构(在未知bean的情况下委托给父级)。
子类实现的主要模板方法是getBeanDefinition和createBean,分别检索给定bean名称的bean定义和为给定bean定义创建 bean 实例。这些操作的默认实现可以在DefaultListableBeanFactory和AbstractAutowireCapableBeanFactory中找到。AbstractBeanFactory的无参构造器:

	public AbstractBeanFactory() {
	}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/825281.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号