Spring IoC、应用上下文容器层次分析

相信很多同学在学习Spring源码时,总会被Spring IoC和应用上下文复杂的层次性所搞晕,debug时一会调到这个类某个方法一会调到那个类的某个方法,经常搞得晕头转向的,今天我们就分析下Spring IoC和应用上下文(ApplicationContext)的层次,每个接口定义了哪些方法,它们的作用是什么?

BeanFactory

这里我们以Spring 中唯一可用的IoC产品-DefaulListableBeanFactory的类关系图为例。
在这里插入图片描述

AliasRegistry

简单来说,该接口定义了和别名注册相关的新增、移除、查询等方法。

public interface AliasRegistry {

	/**
	 * 注册指定name的别名(alias)
	 */
	void registerAlias(String name, String alias);

	/**
	 * 移除别名
	 */
	void removeAlias(String alias);

	/**
	 * 判断给定的name是否是别名
	 */
	boolean isAlias(String name);

	/**
	 * 根据name获取其关联的所有别名
	 */
	String[] getAliases(String name);

}

SingletonBeanRegistry

该接口定义了一系列和单例Bean相关的注册、查询、判断相关方法。

public interface SingletonBeanRegistry {

	/**
	 * 注册单例Bean
	 */
	void registerSingleton(String beanName, Object singletonObject);

	/**
	 * 根据给定的beanName获取单例Bean
	 */
	@Nullable
	Object getSingleton(String beanName);

	/**
	 * 根据给定的beanName判断是否包含其实例
	 */
	boolean containsSingleton(String beanName);

	/**
	 * 获取已注册的所有单例Bean名称
	 */
	String[] getSingletonNames();

	/**
	 * 获取已注册的单例Bean数量
	 */
	int getSingletonCount();

	/**
	 * 获取互斥条件
	 */
	Object getSingletonMutex();

}

BeanDefinitionRegistry

该接口定义了一系列和Bean元数据(BeanDefinition)相关的新增、移除、查询方法。

public interface BeanDefinitionRegistry extends AliasRegistry {

	/**
	 * 注册BeanDefinition
	 */
	void registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
			throws BeanDefinitionStoreException;

	/**
	 * 根据给定的beanName移除其BeanDefinition
	 */
	void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 根据给定的beanName获取其BeanDefinition
	 */
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 根据给定的beanName判断是否包含其BeanDefinition
	 */
	boolean containsBeanDefinition(String beanName);

	/**
	 * 获取已注册的所有BeanDefinition名称
	 */
	String[] getBeanDefinitionNames();

	/**
	 * 获取已注册的BeanDefinition数量
	 */
	int getBeanDefinitionCount();

	/**
	 * 判断指定beanName是否被使用
	 */
	boolean isBeanNameInUse(String beanName);

}

BeanFactory

简而言之,该接口就是一个单一类型的Bean查找接口,所有实现了该接口的IoC容器都具备根据类型或名字来查找单个Bean的能力。

public interface BeanFactory {

	/**
	 * 根据beanName来查找Bean
	 */
	Object getBean(String name) throws BeansException;

	/**
	 * 根据beanName和类型来查找Bean
	 */
	<T> T getBean(String name, @Nullable Class<T> requiredType) throws BeansException;

	/**
	 * 根据beanName和构造函数参数/工厂方法参数来查找Bean
	 */
	Object getBean(String name, Object... args) throws BeansException;

	/**
	 * 根据类型来查找Bean
	 */
	<T> T getBean(Class<T> requiredType) throws BeansException;

	/**
	 * 根据类型和构造函数参数/工厂方法来查找Bean
	 */
	<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

	/**
	 * 根据指定类型来延迟查找Bean
	 */
	<T> ObjectProvider<T> getBeanProvider(Class<T> requiredType);

	/**
	 * 根据给定的ResolvableType 来延迟查找Bean。
	 */
	<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);


	/**
	 * 是否包含指定Bean
	 */
	boolean containsBean(String name);

	/**
	 * 根据名字判断指定Bean是否是单例
	 */
	boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 根据名字判断指定Bean是否是原型
	 */
	boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 检查给定的beanName是否与指定的类型匹配。
	 */
	boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 检查给定的beanName是否与指定的类型匹配。
	 */
	boolean isTypeMatch(String name, @Nullable Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

	/**
	 * 根据名字来获取其类型
	 */
	@Nullable
	Class<?> getType(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 根据名字来获取其相关的别名
	 */
	String[] getAliases(String name);

}

ListableBeanFactory

简而言之,该接口就是一个集合类型Bean查找接口,让所有继承或实现该接口的类具有列表查找Bean的能力。

public interface ListableBeanFactory extends BeanFactory {

	/**
	 * 根据beanName判断是否包含指定BeanDefinition
	 */
	boolean containsBeanDefinition(String beanName);

	/**
	 * 获取BeanFactory中所有BeanDefinition数量
	 */
	int getBeanDefinitionCount();

	/**
	 * 获取BeanFactory中所有BeanDefinition的名字
	 */
	String[] getBeanDefinitionNames();

	/**
	 * 获取所有该类型的beanName
	 */
	String[] getBeanNamesForType(ResolvableType type);

	/**
	 * 获取该类型的所有beanName
	 */
	String[] getBeanNamesForType(@Nullable Class<?> type);

	/**
	 * 获取该类型的所有beanName,可以通过allowEagerInit参数来控制FactoryBean是否提前实例化,通过includeNonSingletons来控制是否忽略非单例
	 */
	String[] getBeanNamesForType(@Nullable Class<?> type, boolean includeNonSingletons, boolean allowEagerInit);

	/**
	 * 获取该类型的所有beanName以及相应实例
	 */
	<T> Map<String, T> getBeansOfType(@Nullable Class<T> type) throws BeansException;

	/**
	 * 获取该类型的所有beanName以及相应实例,可以通过allowEagerInit参数来控制FactoryBean是否提前实例化,通过includeNonSingletons来控制是否忽略非单例
	 */
	<T> Map<String, T> getBeansOfType(@Nullable Class<T> type, boolean includeNonSingletons, boolean allowEagerInit)
			throws BeansException;

	/**
	 * 获取所有添加了指定注解类型的beanName
	 */
	String[] getBeanNamesForAnnotation(Class<? extends Annotation> annotationType);

	/**
	 * 获取所有添加了指定注解类型的beanName(key)以及Bean实例(value)
	 */
	Map<String, Object> getBeansWithAnnotation(Class<? extends Annotation> annotationType) throws BeansException;

	/**
	 * 查找指定类型上的指定注解数据
	 */
	@Nullable
	<A extends Annotation> A findAnnotationOnBean(String beanName, Class<A> annotationType)
			throws NoSuchBeanDefinitionException;

}

HierarchicalBeanFactory

该接口允许IoC容器设置父容器(getParentBeanFactory),使得IoC容器拥有了父子容器关系。以及只判断当前IoC容器是否包含指定Bean(containsLocalBean)方法。

public interface HierarchicalBeanFactory extends BeanFactory {

	/**
	 * 返回父bean工厂,如果没有,则返回null
	 */
	@Nullable
	BeanFactory getParentBeanFactory();

	/**
	 * 返回当前bean工厂中是否包含给定名称的bean,忽略在父上下文中定义的bean
	 */
	boolean containsLocalBean(String name);

}

ConfigurableBeanFactory

该接口定义了设置BeanFactory相关行为的方法,如果需要对BeanFactory进行配置,可以查看该接口中定义的方法。

public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

	/**
	 * 允许BeanFactory设置父容器
	 */
	void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

	/**
	 * 设置BeanClassLoader
	 */
	void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);

	/**
	 * 获取BeanClassLoader
	 */
	@Nullable
	ClassLoader getBeanClassLoader();

	/**
	 * 设置临时ClassLoader
	 */
	void setTempClassLoader(@Nullable ClassLoader tempClassLoader);

	/**
	 * 获取临时ClassLoader
	 */
	@Nullable
	ClassLoader getTempClassLoader();

	/**
	 * 设置是否缓存Bean元数据
	 */
	void setCacheBeanMetadata(boolean cacheBeanMetadata);

	/**
	 * 获取是否缓存Bean元数据设置
	 */
	boolean isCacheBeanMetadata();

	/**
	 * 设置Bean表达式解析器
	 */
	void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);

	/**
	 * 获取Bean表达式解析器
	 */
	@Nullable
	BeanExpressionResolver getBeanExpressionResolver();

	/**
	 * 设置统一类型转换服务
	 */
	void setConversionService(@Nullable ConversionService conversionService);

	/**
	 * 获取统一类型转换服务
	 */
	@Nullable
	ConversionService getConversionService();

	/**
	 * 添加属性编辑器注册器
	 */
	void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

	/**
	 * 注册自定义的属性编辑器
	 */
	void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);

	/**
	 * 复制已注册的属性编辑器至目标属性编辑器注册表
	 */
	void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

	/**
	 * 设置类型转换器
	 */
	void setTypeConverter(TypeConverter typeConverter);

	/**
	 * 获取类型转换器
	 */
	TypeConverter getTypeConverter();

	/**
	 * 添加嵌入式解析器(解析@value注解)
	 */
	void addEmbeddedValueResolver(StringValueResolver valueResolver);

	/**
	 * 判断是否存在嵌入式解析器
	 */
	boolean hasEmbeddedValueResolver();

	/**
	 * 移除嵌入式解析器
	 */
	@Nullable
	String resolveEmbeddedValue(String value);

	/**
	 * 添加BeanPostProcessor
	 */
	void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

	/**
	 * 获取已注册的BeanPostProcessor数量
	 */
	int getBeanPostProcessorCount();

	/**
	 * 注册自定义Bean作用域
	 */
	void registerScope(String scopeName, Scope scope);

	/**
	 * 获取已注册的Bean作用域名字
	 */
	String[] getRegisteredScopeNames();

	/**
	 * 根据作用域名字来获取指定作用域
	 */
	@Nullable
	Scope getRegisteredScope(String scopeName);

	/**
	 * 获取访问控制上下文
	 */
	AccessControlContext getAccessControlContext();

	/**
	 * 复制当前BeanFactory配置至目标BeanFactory
	 */
	void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

	/**
	 * 注册别名
	 */
	void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

	/**
	 * 解析别名
	 */
	void resolveAliases(StringValueResolver valueResolver);

	/**
	 * 根据beanName获取合并后的BeanDefinition
	 */
	BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 根据beanName判断是否是FactoryBean
	 */
	boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

	/**
	 * 将给定的beanName设置其是否正在创建
	 */
	void setCurrentlyInCreation(String beanName, boolean inCreation);

	/**
	 * 根据beanName判断正在创建
	 */
	boolean isCurrentlyInCreation(String beanName);

	/**
	 * 注册指定beanName所依赖的beanName
	 */
	void registerDependentBean(String beanName, String dependentBeanName);

	/**
	 * 根据beanName获取所有依赖它的beanName
	 */
	String[] getDependentBeans(String beanName);

	/**
	 * 根据beanName获取它依赖的所有beanName
	 */
	String[] getDependenciesForBean(String beanName);

	/**
	 * 销毁Bean
	 */
	void destroyBean(String beanName, Object beanInstance);

	/**
	 * 销毁作用域Bean
	 */
	void destroyScopedBean(String beanName);

	/**
	 * 销毁所有的单例
	 */
	void destroySingletons();

}

AutowireCapableBeanFactory

该接口定义了一系列和Bean自动装配相关的方法,如果需要对Bean属性的自动装配进行一些操作,可以查看该接口定义的方法。

public interface AutowireCapableBeanFactory extends BeanFactory {

	/**
	 * 创建指定类型的Bean实例,返回的Bean处于就绪状态
	 */
	<T> T createBean(Class<T> beanClass) throws BeansException;

	/**
	 * 处理给定Bean的依赖项
	 */
	void autowireBean(Object existingBean) throws BeansException;

	/**
	 * 配置Bean的自动装配属性,并调用其工厂方法
	 */
	Object configureBean(Object existingBean, String beanName) throws BeansException;

	/**
	 * 创建指定类型的Bean实例,返回的Bean处于就绪状态,可以通过参数autowireMode来控制其依赖注入模型,例如是根据类型注入还是根据名称注入
	 */
	Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

	/**
	 * 使用指定的自动装配模型来实例化给定类的bean实例
	 */
	Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException;

	/**
	 * 根据名称或类型自动装配给定bean实例的bean属性。
	 */
	void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck)
			throws BeansException;

	/**
	 * 将给定的beanName对应的bean所定义的属性值应用到给定的bean实例
	 */
	void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException;

	/**
	 * 执行给定Bean的生命周期方法
	 */
	Object initializeBean(Object existingBean, String beanName) throws BeansException;

	/**
	 * 根据给定的Bean来执行BeanPostProcessor实现类的postProcessorsBeforeInitialization方法
	 */
	Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException;

	/**
	 * 根据给定的Bean来执行BeanPostProcessor实现类的postProcessorsAfterInitialization(方法
	 */
	Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException;

	/**
	 * 销毁Bean,执行Bean中的相关销毁方法
	 */
	void destroyBean(Object existingBean);

	/**
	 * 解析唯一匹配给定对象类型(如果有的话)的bean实例,
	 */
	<T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException;

	/**
	 * 为给定的bean名称解析一个bean实例,提供一个依赖描述符
	 */
	Object resolveBeanByName(String name, DependencyDescriptor descriptor) throws BeansException;

	/**
	 * 根据依赖描述符解析其依赖项
	 */
	@Nullable
	Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName) throws BeansException;

	/**
	 * 根据依赖描述符解析其依赖项,可以指定候选的beanName以及相应的类型转换器
	 */
	@Nullable
	Object resolveDependency(DependencyDescriptor descriptor, @Nullable String requestingBeanName,
			@Nullable Set<String> autowiredBeanNames, @Nullable TypeConverter typeConverter) throws BeansException;

}

ConfigurableListableBeanFactory

ConfigurableListableBeanFactory接口在ConfigurableBeanFactory接口基础之上更进一步,新增了支持添加忽略依赖类型和支持依赖类型的方法,但最重要的是其定义的preInstantiateSingletons方法,通过调用该方法,可以使IoC容器中所有非懒加载的单例Bean进行实例化以及初始化。

public interface ConfigurableListableBeanFactory
		extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

	/**
	 * 注册要忽略的依赖类型
	 */
	void ignoreDependencyType(Class<?> type);

	/**
	 * 注册要忽略的依赖接口类型
	 */
	void ignoreDependencyInterface(Class<?> ifc);

	/**
	 * 注册支持的依赖接口类型
	 */
	void registerResolvableDependency(Class<?> dependencyType, @Nullable Object autowiredValue);

	/**
	 * 判断指定的bean是否符合自动装配候选条件
	 */
	boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor)
			throws NoSuchBeanDefinitionException;

	/**
	 * 根据给定的beanName获取其BeanDefinition
	 */
	BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

	/**
	 * 获取BeanName迭代器
	 */
	Iterator<String> getBeanNamesIterator();

	/**
	 * 清除元数据缓存
	 */
	void clearMetadataCache();

	/**
	 * 冻结配置
	 */
	void freezeConfiguration();

	/**
	 * 获取配置冻结状态
	 */
	boolean isConfigurationFrozen();

	/**
	 * 初始化所有单例Bean
	 */
	void preInstantiateSingletons() throws BeansException;

}

Spring IoC容器层次总结

以上就是我们对IoC容器层次性分析,其实总结起来也很简单:

AliasRegistry接口定义了一系列和别名相关的增删查方法。
SingletonBeanRegistry接口定义了一系列和单例Bean相关的增删查方法。
BeanFactory接口定义了IoC容器的基本功能,例如单一类型的Bean查找,判断指定Bean是否是单例或者是原型;
ListableBeanFactory接口在BeanFactory基础上扩展了列表类型Bean查找的功能;HierarchicalBeanFactory接口在BeanFactory基础上扩展了允许IoC容器存在层次性;ConfigurableBeanFactory接口在HierarachicalBeanFactory以及SingletonBeanRegistry基础上扩展了可配置IoC容器的功能。
AutowireCapableBeanFactory接口定义了一系列和Bean自动装配相关的方法,其实就是可以处理Bean的依赖项。
ConfigurableListableBeanFactory在ConfigurableBeanFactory基础上更进一步,支持配置IoC容器可以处理以及需要忽略的依赖项(这些要忽略的依赖项有BeanFactoryAware、ApplicationContextAware等)。但最重要的是其定义的preInstantiateSingletons方法,通过该方法可以预实例化所有的单例Bean。

Spring应用上下文

在Spring应用上下文-ApplicationContext层次性分析这块,我们以注解驱动的应用上下文-AnnotationConfigApplicationContext层次分析为例。
在这里插入图片描述

ApplicationContext

ApplicationContext是Spring 应用上下文模块的根接口,该接口通过继承EnvironmentCapable、ListableBeanFactory、HierarchicalBeanFactory、MessageSource、ApplicationEventPublisher、ResourcePatternResolver 这六个接口来确定了应用上下文的基本功能。

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

	/**
	 * 返回当前上下文ID
	 */
	@Nullable
	String getId();

	/**
	 * 获取当前应用上下文名称
	 */
	String getApplicationName();

	/**
	 * 获取显示的名字
	 */
	String getDisplayName();

	/**
	 * 获取启动时间
	 */
	long getStartupDate();

	/**
	 * 获取父容器
	 */
	@Nullable
	ApplicationContext getParent();

	/**
	 * 获取AutowireCapableBeanFactory实例
	 */
	AutowireCapableBeanFactory getAutowireCapableBeanFactory() throws IllegalStateException;

}

EnvironmentCapable

EnvironmentCapable 接口十分简单,该接口标识其具有环境能力。

public interface EnvironmentCapable {

	/**
	 * 返回关联的环境
	 */
	Environment getEnvironment();

}
MessageSource

MessageSource 接口定义了国际化相关的能力,该接口的存在感很弱并且日常开发基本用不到,这里我们就不详细分析了。

public interface MessageSource {

	/**
	 * 根据 code以及参数和本地语言环境来获取对应的文案,如果没有那就使用传入的默认文案(defaultMessage)
	 */
	@Nullable
	String getMessage(String code, @Nullable Object[] args, @Nullable String defaultMessage, Locale locale);

	/**
	 * 根据 code以及参数和本地语言环境来获取对应的文案
	 */
	String getMessage(String code, @Nullable Object[] args, Locale locale) throws NoSuchMessageException;

	/**
	 * 根据MessageSourceResolvable以及本地语言环境来获取对应的文案
	 */
	String getMessage(MessageSourceResolvable resolvable, Locale locale) throws NoSuchMessageException;

}

ApplicationEventPublisher

ApplicationEventPublisher 接口定义了发布应用上下文事件的能力。

@FunctionalInterface
public interface ApplicationEventPublisher {

	/**
	 * 发布应用上下文事件,限定事件类型必须为ApplicationEvent 类型
	 */
	default void publishEvent(ApplicationEvent event) {
		publishEvent((Object) event);
	}

	/**
	 * 发布应用上下文事件,事件类型可以是任意类型
	 */
	void publishEvent(Object event);

}

ResourcePatternResolver

ResourcePatternResolver 接口定义了根据通配路径来加载资源(多个)的能力,其继承的ResourceLoader只定义了根据路径来加载单个资源的能力。

public interface ResourcePatternResolver extends ResourceLoader {

	/**
	 * 根据给定通配路径来加载资源
	 */
	Resource[] getResources(String locationPattern) throws IOException;

}

Lifecycle

Lifecycle 接口定义了Spring应用上下文生命周期相关方法。

public interface Lifecycle {

	/**
	 * 应用上下文启动
	 */
	void start();

	/**
	 * 应用上下文停止
	 */
	void stop();

	/**
	 * 是否正在运行
	 */
	boolean isRunning();

}

ConfigurableApplicationContext

该接口和ConfigurableBeanFactory接口作用相似,提供配置Spring应用上下文相关方法。

public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {

	/**
	 * 设置应用上下文ID
	 */
	void setId(String id);

	/**
	 * 设置父应用上下文
	 */
	void setParent(@Nullable ApplicationContext parent);

	/**
	 * 设置环境对象
	 */
	void setEnvironment(ConfigurableEnvironment environment);

	/**
	 * 获取关联的环境对象
	 */
	@Override
	ConfigurableEnvironment getEnvironment();

	/**
	 * 添加BeanFactoryPostProcessor实现类
	 */
	void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor);

	/**
	 * 添加应用程序监听器
	 */
	void addApplicationListener(ApplicationListener<?> listener);

	/**
	 * 添加协议解析器
	 */
	void addProtocolResolver(ProtocolResolver resolver);

	/**
	 * Spring 应用上下文中最重要的方法,刷新Spring应用上下文
	 */
	void refresh() throws BeansException, IllegalStateException;

	/**
	 * 注册应用上下文钩子线程(和JVM关闭时的钩子方法有关)
	 */
	void registerShutdownHook();

	/**
	 * 关闭应用上下文
	 */
	@Override
	void close();

	/**
	 * 返回当前应用上下文活跃状态
	 */
	boolean isActive();

	/**
	 * 获取当前Spring应用上下文所关联的ConfigurableListableBeanFactory实例
	 */
	ConfigurableListableBeanFactory getBeanFactory() throws IllegalStateException;

}

AnnotationConfigRegistry

该接口定义了配置类注册能力以及根据包路径进行类资源扫描能力。

public interface AnnotationConfigRegistry {

	/**
	 * 注册配置类
	 */
	void register(Class<?>... annotatedClasses);

	/**
	 * 根据指定包路径扫描资源
	 */
	void scan(String... basePackages);

}

Spring应用上下文层次总结

Spring 应用上下文层次总结起来也很简单,根接口是ApplicationContext。该接口只定义了获取启动时间、应用程序显示名字、应用程序名字、应用程序ID、Spring应用上下文层次以及获取关联的BeanFactory对象。
EnvironmentCapable接口定义了获取Environemnt对象。
MessageSource接口定义了Spring国际化相关方法。
ApplicationEventPublisher接口定义了事件发布相关方法。
ResourcePatternResolver接口定义了通配路径资源解析相关方法。
Lifecycle接口定义了Spring 应用上下文生命周期相关方法。
ConfigurableApplicationContext 接口定义了可配置Spring应用上下文相关方法。
AnnotationConfigRegistry接口定义了注册配置以及扫描指定包路径相关方法。

结束语

以上就是我们对Spring IoC以及应用上下文层次相关分析,这里我们没有具体的类进行分析,因为无论是抽象类还是具体的类都是对接口的方法进行实现,扩展很少。

其实想要理解Spring IoC以及应用上下文层次非常简单,因为Spring 会把一组功能放到一个接口中(这也是接口隔离、单一职责规范的体现),这也是只需要记住每个接口它们的大致职责是什么,这样有需要的时候,就可以去查看具体接口中有哪些方法。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值