Spring BeanFactory源码解析

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】
免费领取10G资料包与项目实战视频资料

一、BeanFactory接口

  1. BeanFactory接口是工厂方法的实现机制,具体定义了以下几个方法:
    public interface BeanFactory {

        // 对于FactoryBean,该前缀用于取出FactoryBean,而非getObject对应的方法
        String FACTORY_BEAN_PREFIX = "&";
        // 返回bean实例,如果当前bean工厂不存在该bean,则从父BeanFactory获取bean实例
        Object getBean(String name) throws BeansException;

         // 获取到bean实例,并转化为对应类型的实例,不存在时同样从父进程查找,其中requiredType可能是接口或者超类
        <T> T getBean(String name, Class<T> requiredType) throws BeansException;

        // 返回唯一匹配该类型的bean,注意多个同类型的bean实例会抛出异常
        <T> T getBean(Class<T> requiredType) throws BeansException;

        // 获取bean,并且给定构造参数
        Object getBean(String name, Object... args) throws BeansException;

        <T> T getBean(Class<T> requiredType, Object... args) throws BeansException;

        // 判断当前BeanFactory是否含有该bean的定义,不存在时从父beanFactory寻找,未必能生成实例
        boolean containsBean(String name);

        // 判断bean是否是单例的
        boolean isSingleton(String name) throws NoSuchBeanDefinitionException;

        // 判断是否每次都会取得一个独立的bean
        boolean isPrototype(String name) throws NoSuchBeanDefinitionException;

        // 获取到的bean是否是typeMatch类型
        boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;

        // 返回给定的bean是否可以赋值给typeToMatch
        boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;

        // 返回给定bean的所属类型,对于FactoryBean返回getObjectType
        Class<?> getType(String name) throws NoSuchBeanDefinitionException;

        // 返回给定bean的所有别名,bean的原始名称放在第一位,如果不存在,则返回空数组
        String[] getAliases(String name);

    }
  1. 继承自BeanFactory的子接口:HierarchicalBeanFactory,该实例使得具有BeanFactory具有父子关系。
    public interface HierarchicalBeanFactory extends BeanFactory {

        // 获取父beanFactory
        BeanFactory getParentBeanFactory();

        // 判断当前beanFacoty实例是否含有该bean,只判断当前beanFactory
        boolean containsLocalBean(String name);

    }
  1. SingletonBeanRegistry提供注册单例bean的功能。
    public interface SingletonBeanRegistry {

        // 注册单例bean,该单例必须已经经过初始化
        void registerSingleton(String beanName, Object singletonObject);

        // 获取单例的bean,注意该单例已经初始化完成
        Object getSingleton(String beanName);

        // 注意此方法不识别bean别名或者FactoryBean的前缀&,必须是bean的原始名字。
        boolean containsSingleton(String beanName);

        // 返回单例的bean名称,永远不会返回null
        String[] getSingletonNames();

        // 获取已经初始化的单例的个数
        int getSingletonCount();

        Object getSingletonMutex();

    }
  1. 可配置的ConfigurableBeanFactory,注意应用代码中不应使用这个接口,而应使用BeanFactory或则ListableBeanFactory。这个接口可以操作beanfactory,仅供内部使用。
    public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {

        String SCOPE_SINGLETON = "singleton";
        String SCOPE_PROTOTYPE = "prototype";

        void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException;

        void setBeanClassLoader(ClassLoader beanClassLoader);

        ClassLoader getBeanClassLoader();

        void setTempClassLoader(ClassLoader tempClassLoader);

        ClassLoader getTempClassLoader();

        void setCacheBeanMetadata(boolean cacheBeanMetadata);

        boolean isCacheBeanMetadata();

        // 设置表达式解析测试
        void setBeanExpressionResolver(BeanExpressionResolver resolver);

        BeanExpressionResolver getBeanExpressionResolver();

        // 设置ConversionService,替代PropertyEditor,从3.0开始
        void setConversionService(ConversionService conversionService);

        ConversionService getConversionService();

        // 添加属性管家,用于整个bean的创建过程
        void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar);

        // 注册属性编辑器,注意属性编辑器实例是线程安全的,推荐使用conversionService
        void registerCustomEditor(Class<?> requiredType, Class<? extends PropertyEditor> propertyEditorClass);

        // 用beanfactoy中的自定义属性编辑器初始化给定的注册表项
        void copyRegisteredEditorsTo(PropertyEditorRegistry registry);

        // 设定属性转化器,用于转化属性值和构造函数入参等。
        void setTypeConverter(TypeConverter typeConverter);

        // 可能每次都得到一个新的值,因为TypeConverter不是线程安全的
        TypeConverter getTypeConverter();

        // 添加值解析器用于解析嵌入的值,如注解中的值
        void addEmbeddedValueResolver(StringValueResolver valueResolver);

        // 解析嵌入的值,如注解中的值,返回解析后的值
        String resolveEmbeddedValue(String value);

        // 注册BeanPostProcessor,这部分先于配置的BeanPostProcessor,且按照注册的顺序执行,与Ordered接口无关。
        void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

        // 获取当前已经注册的BeanPostProcessor个数
        int getBeanPostProcessorCount();
        // 注册指定的Scope
        void registerScope(String scopeName, Scope scope);

        String[] getRegisteredScopeNames();

        Scope getRegisteredScope(String scopeName);

        AccessControlContext getAccessControlContext();

        // 从给定的beanFacoty复制后处理器等到当前的beanfactory,不能复制任何和BeanDefinition相关的属性,包括bean别名等
        void copyConfigurationFrom(ConfigurableBeanFactory otherFactory);

        // 注册给定bean的别名,如果别名已经被使用,将抛出异常
        void registerAlias(String beanName, String alias) throws BeanDefinitionStoreException;

        // 使用valueResolver解析注册在当前beanfactory的所有别名
        void resolveAliases(StringValueResolver valueResolver);

        // 返回指定的bean和父bean合并的BeanDefinition
        BeanDefinition getMergedBeanDefinition(String beanName) throws NoSuchBeanDefinitionException;

        // 判断给定的bean是否为FactoryBean,注意name对应的bean必须存在,不存在将抛出NoSuchBeanDefinitionException。
        boolean isFactoryBean(String name) throws NoSuchBeanDefinitionException;

        // 该方法由容器内部使用
        void setCurrentlyInCreation(String beanName, boolean inCreation);

        // 判断beanName是否正在创建中
        boolean isCurrentlyInCreation(String beanName);

        // 注册beanName依赖的bean,这些被依赖的bean会被先销毁。
        void registerDependentBean(String beanName, String dependentBeanName);

        // 获取所有依赖beanName的bean的名称
        String[] getDependentBeans(String beanName);

        // 获得指定bean依赖的bean的名称
        String[] getDependenciesForBean(String beanName);

        void destroyBean(String beanName, Object beanInstance);

        void destroyScopedBean(String beanName);

        // 在beanfactory销毁时调用,该方法本身必须捕获异常,而不是抛给调用者
        void destroySingletons();
    }

来源:http://ddrv.cn/a/88268

赞(1) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring BeanFactory源码解析

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏