• springIOC源码接口分析(二):ConfigurableBeanFactory


    一 继承功能

     1 SingletonBeanRegistry接口

      此接口是针对Spring中的单例Bean设计的。提供了统一访问单例Bean的功能,类中定义了以下方法:

     2 HierarchicalBeanFactory接口使容器具备了双亲功能

    二 定义方法以及属性

     接口首先定义了两个String属性:

     这两个是用来标明注册的对象作用域,一个标明注册的对象是单例的,另一个标明注册的对象是原型拷贝的

     这个接口是spring框架中非常重要的一个接口,定义了非常多的方法,总共三十多个,包括类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域

    ,bean定义,bea创建状态,处理bean依赖关系,合并其他ConfigurableBeanFactory,bean如何销毁等,下面是具体方法:

        String SCOPE_SINGLETON = "singleton";//单例
        String SCOPE_PROTOTYPE = "prototype";//原型
    
        /**
         * 设置容器的父容器,获取父容器方法在父接口HierarchicalBeanFactory里
         */
        void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;
    
        /**
         * 设置和获取类加载器,主要用于加载Bean,默认是线上上下文的loader
         */
        void setBeanClassLoader(@Nullable ClassLoader beanClassLoader);
        @Nullable
        ClassLoader getBeanClassLoader();
    
        /**
         * 设置获取临时类加载器
         */
        void setTempClassLoader(@Nullable ClassLoader tempClassLoader);
        @Nullable
        ClassLoader getTempClassLoader();
    
        /**
         * 设置是否缓存给定BeanDefinition和确定Bean类型的元数据,默认是开启状态.
         * 关掉flag缓存会启用beanDefinition对象的热刷新.任何bean实例的创建都将重新查询bean class loader来确定这个Bean最新的类型
         */
        void setCacheBeanMetadata(boolean cacheBeanMetadata);
        boolean isCacheBeanMetadata();
    
        /**
         * 为beanDefinition值中的表达式提供解决策略.默认的BeanFactory里是没有激活的表达式支持的.
         * 一个ApplicationContext通常会设置一个标准的表达式策略,以一种统一的EL兼容风格支持“#{}”表达式.
         */
        void setBeanExpressionResolver(@Nullable BeanExpressionResolver resolver);
        @Nullable
        BeanExpressionResolver getBeanExpressionResolver();
    
        /**
         * 设置和获取ConversionService接口,进行数据类型转换
         * @param conversionService
         */
        void setConversionService(@Nullable ConversionService conversionService);
        @Nullable
        ConversionService getConversionService();
    
        /**
         * 添加一个PropertyEditorRegistrar应用于所有bean的创建过程.
         * 一个Registrar创建了一个新的PropertyEditor实例,并且会将他们注册到一个给定的Registry中,并尝试刷新每个bean的创建.
         * 这就避免了自定义Editor的同步应用需求.因此通常更倾向于使用这个方法来代替registerCustomEditor.
         */
        void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);
    
        /**
         * 为所有给定类型的属性注册一个给定的自定义属性编辑器.通常在factory配置期间被调用.
         * 注意这个方法注册一个共享的自定义属性编辑器实例;为了线程安全,需要授权该实例去进行同步操作.
         * 通常更倾向于使用addPropertyEditorRegistrar来代替这个方法,这就避免了自定义编辑器同步的需要
         */
        void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);
    
        /**
         * 使用一个已经在BeanFactory里注册过的自定义属性编辑器来初始化给定的PropertyEditorRegistry.
         */
        void copyRegisteredEditorsTo(PropertyEditorRegistry registry);
    
        /**
         * 设置或获取自定义的类型转换器,BeanFactory用它来对Bean的属性值,构造参数等进行转换.这将会覆盖默认的PropertyEditor机制,
         * 因此,使用无关的自定义Editor或自定义Editor Registrars.因为TypeConverter通常不是线程安全的,所以每次调用都会产生一个新的实例.
         * 如果默认的PropertyEditor机制被激活,获取typeConverter方法将会返回所有已被注册的自定义的typeConverter
         */
        void setTypeConverter(TypeConverter typeConverter);
        TypeConverter getTypeConverter();
    
        /**
         * 用来增加一个嵌入式的StringValueResolver,比如说注解的属性.可以参考SpringMVC中的ArgumentResolver.
         */
        void addEmbeddedValueResolver(StringValueResolver valueResolver);
    
        /**
         * 确定是否有一个嵌入式的value resolver已经在这个bean factory中注册了,并且可以通过resolveEmbeddedValue函数来应用.
         */
        boolean hasEmbeddedValueResolver();
    
        /**
         * 决定一个给定的嵌入式的值,例如注解中的属性
         */
        @Nullable
        String resolveEmbeddedValue(String value);
    
        /**
         *添加一个新的BeanPostProcessor,通过这个工厂所创建的beans将会应用这个后置处理器.
         * 在工厂的配置期间调用.注意这里的Post-processor提交将会按着registration的顺序被依次应用.
         * 任何通过Ordered这个接口所实现的顺序语义将会被忽略.也要注意到自动检测的后置处理器将会在以编程方式注册的那些后置处理器之后执行.
         */
        void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);
    
        //获取已经注册的Bean后置处理器的个数
        int getBeanPostProcessorCount();
    
        /**
         *注册一个给定的scope,支持Scope的实现类.
         */
        void registerScope(String scopeName, Scope scope);
    
        /**
         * 返回所有当前注册过的scope的名字.这个方法只返回明确注册过的scope的名字,内置的(Built-in)scopes像”singleton”和”prototype”不会被暴露.
         * 如果没有返回的是空数组.
         */
        String[] getRegisteredScopeNames();
    
        /**
         * 如果有的话,返回给定名字的Scope实现.和上一个函数一样,将只返回明确注册过的scope,内置的(Built-in)scopes像”singleton”和”prototype”不会被暴露.
         */
        @Nullable
        Scope getRegisteredScope(String scopeName);
    
        /**
         * 提供一个与这个工厂相关的安全的访问控制上下文.这个绝不会为空.
         */
        AccessControlContext getAccessControlContext();
    
        /**
         * 从给定的工厂中拷贝所有相关的配置信息.应该包括了所有标准的配置,也包括了BeanPostProcessor,Scopes和factory-specific内置的一些配置.
         * 应该不包括任何真实Bean的metadata信息,像BeanDefinition对象和bean的别名等
         */
        void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);
    
        /**
         * 给定一个bean的名字,创建它的别名.这个方法的典型应用是支持那些在XML的ids里是无效的名字(被用于Bean的命名).
         * 通常都是在factory的配置期间被调用,但是也可以用于别名的registration的运行时.所以一个实现了该函数的接口应该同步别名访问.
         */
        void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;
    
        /**
         * 处理所有目标名称的别名和在这个工厂注册过的别名,然后为它们应用给定的StringValueResolver.
         * 这个value resolver是处理像目标bean名称甚或在别名名称里的占位符而设置的.
         */
        void resolveAliases(StringValueResolver valueResolver);
    
        /**
         * 返回一个给定名字的合并后的BeanDefinition,如果有必要会将子BeanDefinition和父BeanDefinition进行合并.
         * 并且也会考虑祖先容器中的BeanDefinition
         */
        BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;
    
        //判断给定名字的Bean是否是一个FactoryBean.
        boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;
    
        /**
         * 设置Bean的当前创建状态
         * @param beanName
         * @param inCreation Bean是否正在创建中
         */
        void setCurrentlyInCreation(String beanName, boolean inCreation);
    
        boolean isCurrentlyInCreation(String beanName);
    
        /**
         * 为给定名称的Bean注册一个依赖Bean,并且该依赖Bean会在给定的Bean被销毁之前进行销毁
         */
        void registerDependentBean(String beanName, String dependentBeanName);
    
        /**
         *如果有的话,返回依赖于给定名字Bean的所有Bean名称.
         */
        String[] getDependentBeans(String beanName);
    
        /**
         * 如果有的话,返回给定名字Bean所依赖的所有Bean名称.
         */
        String[] getDependenciesForBean(String beanName);
    
        /**
         * 依据BeanDefinition,销毁给定Bean的实例,(通常会从这个工厂中获取一个原型实例).
         * 在销毁期间所抛出的任何异常都应该用捕获来取代往这个方法的调用者那里抛出.
         */
        void destroyBean(String beanName, Object beanInstance);
    
        /**
         * 如果有的话,在当前目标Scope中销毁指定的ScopeBean.
         * 在销毁期间所抛出的任何异常都应该用捕获来取代往这个方法的调用者那里抛出
         */
        void destroyScopedBean(String beanName);
    
        /**
         * 销毁这个工厂中所有的singleton bean,包括一次性的已经注册的内嵌Bean.在工厂关闭的时候会被调用.
         * 在销毁期间所抛出的任何异常都应该用捕获来取代往这个方法的调用者那里抛出.
         */
        void destroySingletons();

     ConfigurableBeanFactory接口没有被ApplicationContext等常用容器接口所继承,但是一般容器实现类都会继承这个接口,目的是使用一种统一的方式对外暴露他们的单例管理方式.

  • 相关阅读:
    005.SQLServer AlwaysOn可用性组高可用简介
    004.Windows Server 故障转移群集 (WSFC)简介
    003.SQLServer数据库镜像高可用部署
    附008.Kubernetes TLS证书介绍及创建
    附007.Kubernetes ABAC授权
    附006.Kubernetes RBAC授权
    附005.Kubernetes身份认证
    附004.Kubernetes Dashboard简介及使用
    附003.Kubeadm部署Kubernetes
    附002.Minikube介绍及使用
  • 原文地址:https://www.cnblogs.com/houzheng/p/11839278.html
Copyright © 2020-2023  润新知