博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring-全量自定义-BeanFactory
阅读量:4144 次
发布时间:2019-05-25

本文共 6630 字,大约阅读时间需要 22 分钟。

BeanFactory是接入spring-bean容器的基本客户端视图。有比较复杂的实现。其中,bean的完整初始化顺序如下:具体请参照BeanFactory源码

    *
  1. BeanNameAware's {@code setBeanName} *
  2. BeanClassLoaderAware's {@code setBeanClassLoader} *
  3. BeanFactoryAware's {@code setBeanFactory} *
  4. EnvironmentAware's {@code setEnvironment} *
  5. EmbeddedValueResolverAware's {@code setEmbeddedValueResolver} *
  6. ResourceLoaderAware's {@code setResourceLoader} * (only applicable when running in an application context) *
  7. ApplicationEventPublisherAware's {@code setApplicationEventPublisher} * (only applicable when running in an application context) *
  8. MessageSourceAware's {@code setMessageSource} * (only applicable when running in an application context) *
  9. ApplicationContextAware's {@code setApplicationContext} * (only applicable when running in an application context) *
  10. ServletContextAware's {@code setServletContext} * (only applicable when running in a web application context) *
  11. {@code postProcessBeforeInitialization} methods of BeanPostProcessors *
  12. InitializingBean's {@code afterPropertiesSet} *
  13. a custom init-method definition *
  14. {@code postProcessAfterInitialization} methods of BeanPostProcessors *

以上是初始化方法和他们的标准顺序,主要是各种aware接口和BeanPostProcessors流程。本章将不做过多介绍,后续章节会对部分流程,结合Bean的初始化流程进行解析。

先来看一下BeanFactory为我们提供的基本视图:

//通过bean的名字获取bean对象	Object getBean(String name) throws BeansException;	//根据bean的类型和名字获取bean对象	
T getBean(String name, Class
requiredType) throws BeansException; //根据bean的名字和构造参数工厂方法参数获取bean Object getBean(String name, Object... args) throws BeansException; //通过bean的类型获取bean
T getBean(Class
requiredType) throws BeansException; //根据类型和参数获取bean
T getBean(Class
requiredType, Object... args) throws BeansException; //获取bean的提供者
ObjectProvider
getBeanProvider(Class
requiredType); //指定类型的bean提供者
ObjectProvider
getBeanProvider(ResolvableType requiredType); //包含bean boolean containsBean(String name); //是否是单列 boolean isSingleton(String name) throws NoSuchBeanDefinitionException; //非单列 boolean isPrototype(String name) throws NoSuchBeanDefinitionException; //类型是否匹配 boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException; //类型是否匹配 boolean isTypeMatch(String name, Class
typeToMatch) throws NoSuchBeanDefinitionException; //查询类型 @Nullable Class
getType(String name) throws NoSuchBeanDefinitionException; //bean的别名 String[] getAliases(String name);

BeanFactory的直接子接口有三个:

HierarchicalBeanFactory //支持BeanFactory继承功能
AutowireCapableBeanFactory //定义自动注入以及bean的创建和执行标准初始化方法接口
ListableBeanFactory //列举当前BeanFactory的bean

接下来详细看一下ConfigurableBeanFactory提供了那些功能,这个接口方法比较多,但是比较重要,他是整个容器的配置,所有的可配置功能,都可以反映出来:

interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry//继承自HierarchicalBeanFactory,SingletonBeanRegistry,可支持BeanFactory层次以及注册单列标准单列域	String SCOPE_SINGLETON = "singleton";prototype域	String SCOPE_PROTOTYPE = "prototype";设置自己的父beanfactory	void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;	设置类加载器用于加载class	void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);	返回classloader	@Nullable	ClassLoader getBeanClassLoader();特殊的类加载器一般用于load-time weaving,加载时织入功能,可实现aop	void setTempClassLoader(@Nullable ClassLoader tempClassLoader);	获取临时类加载器	ClassLoader getTempClassLoader();	设置是否缓存bean的元数据信息,如果关闭功能,每次创建bean都会重新加载bean元数据信息	void setCacheBeanMetadata(boolean cacheBeanMetadata);是否缓存元数据信息	boolean isCacheBeanMetadata();	表达式解析器如支持#{...}	void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);	获取表达式解析器	@Nullable	BeanExpressionResolver getBeanExpressionResolver();	安全转换服务,可参照类型安全转换章节	void setConversionService(@Nullable ConversionService conversionService);	获取类型转换服务	ConversionService getConversionService();	属性编辑器注册	void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);注册自定义属性编辑器	void registerCustomEditor(Class
requiredType, Class
propertyEditorClass);复制属性编辑器 void copyRegisteredEditorsTo(PropertyEditorRegistry registry);类型转换 void setTypeConverter(TypeConverter typeConverter); 获取类型转换 TypeConverter getTypeConverter(); 值解析 void addEmbeddedValueResolver(StringValueResolver valueResolver); 是否有值解析器 boolean hasEmbeddedValueResolver(); 解析值返回解析结果,如注解 @Nullable String resolveEmbeddedValue(String value); 添加后置处理流程 void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); 获取后置处理器数量 int getBeanPostProcessorCount(); 注册自定义域 void registerScope(String scopeName, Scope scope); 获取自注册域名字 String[] getRegisteredScopeNames(); 通过名字获取注册域 @Nullable Scope getRegisteredScope(String scopeName); 安全接入控制上下文 AccessControlContext getAccessControlContext(); 从执行beanfactory复制配置信息 void copyConfigurationFrom(ConfigurableBeanFactory otherFactory); 为指定的beanName注册别名 void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException; 占位符解析 void resolveAliases(StringValueResolver valueResolver); 获取合并bean定义 BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 判断bean是否是FactoryBean boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException; 设置当前bean在创建中 void setCurrentlyInCreation(String beanName, boolean inCreation);当前bean是否在创建中 boolean isCurrentlyInCreation(String beanName); beanName被dependentBeanName依赖 void registerDependentBean(String beanName, String dependentBeanName);获取被依赖bean String[] getDependentBeans(String beanName); 获取依赖bean String[] getDependenciesForBean(String beanName); 销毁bean void destroyBean(String beanName, Object beanInstance);销毁域中的bean void destroyScopedBean(String beanName); 销毁单列 void destroySingletons();

集成式的接口interface ConfigurableListableBeanFactory

extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory
主要是内部实现会使用改接口的方法,大体看一下该接口的方法,方便后面源码分析:

忽略指定类型的依赖,比如String	void ignoreDependencyType(Class
type); 忽略依赖的接口,比如BeanFactory通过BeanFactoryAware接口注入 void ignoreDependencyInterface(Class
ifc);注册为可解析依赖 void registerResolvableDependency(Class
dependencyType, @Nullable Object autowiredValue); 是否是候选注入,主要是同类型bean不同名字时使用 boolean isAutowireCandidate(String beanName, DependencyDescriptor descriptor) throws NoSuchBeanDefinitionException;查询bean定义 BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; 返回当前BeanFactory所有名字的迭代器 Iterator
getBeanNamesIterator(); 清除缓存元数据 void clearMetadataCache(); 冻结当前配置,将不能再更新 void freezeConfiguration(); 配置是否冻结 boolean isConfigurationFrozen(); 确保非懒加载单列都实例话了 void preInstantiateSingletons() throws BeansException;

本节主要介绍了BeanFactory体现通过各个接口提供的功能,下一节将要介绍其主要实现AbstractBeanFactory,以及其自实现。

转载地址:http://yduti.baihongyu.com/

你可能感兴趣的文章
Study of Source code
查看>>
如何使用BBC英语学习频道
查看>>
spring事务探索
查看>>
浅谈Spring声明式事务管理ThreadLocal和JDKProxy
查看>>
初识xsd
查看>>
java 设计模式-职责型模式
查看>>
构造型模式
查看>>
svn out of date 无法更新到最新版本
查看>>
java杂记
查看>>
RunTime.getRuntime().exec()
查看>>
Oracle 分组排序函数
查看>>
删除weblogic 域
查看>>
VMware Workstation 14中文破解版下载(附密钥)(笔记)
查看>>
日志框架学习
查看>>
日志框架学习2
查看>>
SVN-无法查看log,提示Want to go offline,时间显示1970问题,error主要是 url中 有一层的中文进行了2次encode
查看>>
NGINX
查看>>
Qt文件夹选择对话框
查看>>
1062 Talent and Virtue (25 分)
查看>>
1061 Dating (20 分)
查看>>