zoukankan      html  css  js  c++  java
  • spring源码学习笔记之BeanDefinition接口

    package org.springframework.beans.factory.config;
    
    import org.springframework.beans.BeanMetadataElement;
    import org.springframework.beans.MutablePropertyValues;
    import org.springframework.core.AttributeAccessor;
    import org.springframework.lang.Nullable;
    
    /**
     * A BeanDefinition describes a bean instance, which has property values,
     * constructor argument values, and further information supplied by
     * concrete implementations.
     
     * 一个 BeanDefinition 描述了一个bean实例的属性值,构造参数值,它的具体实现还会描述更多的信息。
       可以理解为: BeanDefinition主要是用于描述bean实例信息)
     * <p>This is just a minimal interface: The main intention is to allow a
     * {@link BeanFactoryPostProcessor} such as {@link PropertyPlaceholderConfigurer}
     * to introspect and modify property values and other bean metadata.
     *
     * BeanDefinition是最小的接口。
     * 可以使用BeanFactoryPostProcessor(例如PropertyPlaceholderConfigurer)去检测和修改bean实例的属性值或者它的元数据信息
     *
     * @author Juergen Hoeller
     * @author Rob Harrop
     * @since 19.03.2004
     * @see ConfigurableListableBeanFactory#getBeanDefinition
     * @see org.springframework.beans.factory.support.RootBeanDefinition
     * @see org.springframework.beans.factory.support.ChildBeanDefinition
     */
    public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    
        
         //单例标识符, 可以使用setScope方法修改作用域
        String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
    
        // 多例标示符,可以使用setScope方法修改作用域
        String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
    
        //表示该BeanDefinition的角色是应用角色,说白了就是程序员注入到IOC容器中的bean
        int ROLE_APPLICATION = 0;
    
        //没读懂。。。
        int ROLE_SUPPORT = 1;
    
        // 应该是框架自带的bean,反正不是程序员手动注入的bean
        int ROLE_INFRASTRUCTURE = 2;
    
    
        // 可更改的属性设置
    
        /**
         * 给当前beanDefinition设置一个parent BeanDefinition
         */
        void setParentName(@Nullable String parentName);
    
        /**
         *返回当前beanDefinition的parent BeanDefinition的名字
         */
        @Nullable
        String getParentName();
    
        /**
         * 设置当前bean definition的class类名。
         * 可以使用BeanFactoryPostProcessor这个接口去修改class类名
         * @see #setParentName
         * @see #setFactoryBeanName
         * @see #setFactoryMethodName
         */
        void setBeanClassName(@Nullable String beanClassName);
    
        /**
         * 返回当前bean definition的类名。
         * 不过,需要注意的是,这个类名并非程序运行时的真正类名,比如有可能是覆写或者说是继承自parent bean definiton的名字。
         * @see #getParentName()
         * @see #getFactoryBeanName()
         * @see #getFactoryMethodName()
         */
        @Nullable
        String getBeanClassName();
    
        /**
         * Override the target scope of this bean, specifying a new scope name.
         * @see #SCOPE_SINGLETON
         * @see #SCOPE_PROTOTYPE
         */
        void setScope(@Nullable String scope);
    
        /**
         * Return the name of the current target scope for this bean,
         * or {@code null} if not known yet.
         */
        @Nullable
        String getScope();
    
        /**
         * 设置是否懒加载,如果设置false,在程序启动的时候就是会实例化,也就是说不会懒加载 
         * 注意: 只有单例模式,也有是否懒加载一说呀
         */
        void setLazyInit(boolean lazyInit);
    
    
        boolean isLazyInit();
    
        /**
         * 设置当前bean 初始化时需要依赖那些bean的名字,而且bean工厂会优化初始化那些bean
         */
        void setDependsOn(@Nullable String... dependsOn);
    
        /**
         * 返回当前bean依赖的那些bean的名字(集合)
         */
        @Nullable
        String[] getDependsOn();
    
        /**
         * 设置当前bean是否可以autowire的方式注入到其它的bean中去
         * 注意:该设置仅对基于类型方式的注入有效;也就是说如果是基于名字的autowire注册该设置没啥用。
         */
        void setAutowireCandidate(boolean autowireCandidate);
    
    
        boolean isAutowireCandidate();
    
        /**
         * 设置该bean是否是自动注入的primary bean。 
         * 何为primary bean? 也就是相同注入条件下,该bean优先注入
         * 举个例子,某接口有两个实现,其中一个实现打了@Primary注册,那么在注入接口时,优先注入这个Primary类
         */
        void setPrimary(boolean primary);
    
        
        boolean isPrimary();
    
        /**
         * 指定当前bean的工厂类名,有啥用,不明白
         * @see #setFactoryMethodName
         */
        void setFactoryBeanName(@Nullable String factoryBeanName);
    
        /**
         * Return the factory bean name, if any.
         */
        @Nullable
        String getFactoryBeanName();
    
        /**
         * 指定一个工厂方法,在调用bean的有参构造器或者是无参构造器时会调用这个工厂方法。
         * 该方法将在指定的工厂bean(如果有的话)上调用,或者作为本地bean类的静态方法调用。
         * @see #setFactoryBeanName
         * @see #setBeanClassName
         */
        void setFactoryMethodName(@Nullable String factoryMethodName);
    
        /**
         * 如果有的话,就返回这个工厂方法
         */
        @Nullable
        String getFactoryMethodName();
    
        /**
         * 返回bean构造器参数值, 这些值可以在BeanFactoryPostProcessor中进行修改
         */
        ConstructorArgumentValues getConstructorArgumentValues();
    
        /**
         * Return if there are constructor argument values defined for this bean.
         * @since 5.0.2
         */
        default boolean hasConstructorArgumentValues() {
            return !getConstructorArgumentValues().isEmpty();
        }
    
        /**
         * 返回当前bean的属性值,而且这些值也可以在BeanFactoryPostProcessor中进行修改
         */
        MutablePropertyValues getPropertyValues();
    
        /**
         * Return if there are property values values defined for this bean.
         * @since 5.0.2
         */
        default boolean hasPropertyValues() {
            return !getPropertyValues().isEmpty();
        }
    
        /**
         * 设置初始化方法名称 
         * @since 5.1
         */
        void setInitMethodName(@Nullable String initMethodName);
    
        /**
         * Return the name of the initializer method.
         * @since 5.1
         */
        @Nullable
        String getInitMethodName();
    
        /**
         * 设置销毁这个bean的方法名称 
         * @since 5.1
         */
        void setDestroyMethodName(@Nullable String destroyMethodName);
    
        /**
         * Return the name of the destroy method.
         * @since 5.1
         */
        @Nullable
        String getDestroyMethodName();
    
        /**
         * Set the role hint for this {@code BeanDefinition}. The role hint
         * provides the frameworks as well as tools with an indication of
         * the role and importance of a particular {@code BeanDefinition}.
         * @since 5.1
         * @see #ROLE_APPLICATION
         * @see #ROLE_SUPPORT
         * @see #ROLE_INFRASTRUCTURE
         */
        void setRole(int role);
    
        /**
         * Get the role hint for this {@code BeanDefinition}. The role hint
         * provides the frameworks as well as tools with an indication of
         * the role and importance of a particular {@code BeanDefinition}.
         * @see #ROLE_APPLICATION
         * @see #ROLE_SUPPORT
         * @see #ROLE_INFRASTRUCTURE
         */
        int getRole();
    
        /**
         * 不重要,设置当前bean的描述信息
         * @since 5.1
         */
        void setDescription(@Nullable String description);
    
        /**
         * Return a human-readable description of this bean definition.
         */
        @Nullable
        String getDescription();
    
    
        // Read-only attributes
    
        /**
         * Return whether this a <b>Singleton</b>, with a single, shared instance
         * returned on all calls.
         * @see #SCOPE_SINGLETON
         */
        boolean isSingleton();
    
        /**
         * Return whether this a <b>Prototype</b>, with an independent instance
         * returned for each call.
         * @since 3.0
         * @see #SCOPE_PROTOTYPE
         */
        boolean isPrototype();
    
        /**
         * 当前bean是否是个abstract抽象的bean ,如果是,不实例化
         */
        boolean isAbstract();
    
        /**
         * Return a description of the resource that this bean definition
         * came from (for the purpose of showing context in case of errors).
         */
        @Nullable
        String getResourceDescription();
    
        /**
         * Return the originating BeanDefinition, or {@code null} if none.
         * Allows for retrieving the decorated bean definition, if any.
         * <p>Note that this method returns the immediate originator. Iterate through the
         * originator chain to find the original BeanDefinition as defined by the user.
         * 返回当前bean的起源bean definition, 如果没有,就返回null.
         * 如果是装饰当前bean的bean definition,也行呀。 
         * 不懂。。。。。
         */
        @Nullable
        BeanDefinition getOriginatingBeanDefinition();
    
    }

    能力问题,大体翻译了一下BeanDefinition的注释,对其有个初略的了解。

    未完待续。。。。

  • 相关阅读:
    Centos安装Memcached和(Nginx)Memcache扩展详细教程
    文章已被删除!
    phonegap安卓手机开发入门
    微信分享链接带图片文字和描述
    CSDN数据库被爆 统计CSDN用户都喜欢哪些密码
    ...
    重新初始化 VS2010
    spark系列之基本概念
    python 数字字典加密非汉字
    MySQL 5.7实现 row_number窗口函数
  • 原文地址:https://www.cnblogs.com/z-qinfeng/p/12219880.html
Copyright © 2011-2022 走看看