zoukankan      html  css  js  c++  java
  • spring的bean生命周期

    spring的bean生命周期

    狭义层面:

    class---->new UserService()----->填充属性------>Aware(接口)---------->初始化------------>aop(操作)------------>

    单例池<Map<BeanName,对象>>

    广义层面:

    class---->beanDefinition---------->new UserService()----->填充属性------>Aware(接口)---------->初始化------------>aop(操作)------------>

    单例池<Map<BeanName,对象>>

    BeanDefinition--------------->BeanFactory组建完成(当spring扫描路径下所有类,创建相应的BeanDefinition并将这些定义存放在BeanFactory的beanDefinitionMap中,此时就是组建完成)------------>BeanFactoryProcess-------------->BeanPostProcess

    beanDefinition

    BeanDefinition(bean的定义):

    继承了两个接口:

    1. AttributeAccessor(定义了或者任意对象的附加属性的操作。)

    public interface AttributeAccessor {
    
        
        void setAttribute(String name, @Nullable Object value);
    
        
        @Nullable
        Object getAttribute(String name);
    
        @Nullable
        Object removeAttribute(String name);
    
        
        boolean hasAttribute(String name);
    
        
        String[] attributeNames();
    
    }

    2.BeanMetaDataElement(BeanDefinition元数据,返回该Bean的来源)

    public interface BeanMetadataElement {
    
        /**
         * Return the configuration source {@code Object} for this metadata element
         * (may be {@code null}).
         */
        @Nullable
        Object getSource();
    
    }
    public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {
    
       // 默认只提供 sington 和 prototype 两种,
       
       String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
       String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
    
       int ROLE_APPLICATION = 0;
       int ROLE_SUPPORT = 1;
       int ROLE_INFRASTRUCTURE = 2;
    
       // 设置父 Bean,这里涉及到 bean 继承,不是 java 继承。
       void setParentName(String parentName);
    
       // 获取父 Bean
       String getParentName();
    
       // 设置 Bean 的类名称,将来是要通过反射来生成实例的
       void setBeanClassName(String beanClassName);
    
       // 获取 Bean 的类名称
       String getBeanClassName();
    
    
       // 设置 bean 的 scope
       void setScope(String scope);
    
       String getScope();
    
       // 设置是否懒加载
       void setLazyInit(boolean lazyInit);
    
       boolean isLazyInit();
    
       // 设置该 Bean 依赖的所有的 Bean,注意,这里的依赖不是指属性依赖(如 @Autowire 标记的),
       // 是 depends-on="" 属性设置的值。
       void setDependsOn(String... dependsOn);
    
       // 返回该 Bean 的所有依赖
       String[] getDependsOn();
    
       // 设置该 Bean 是否可以注入到其他 Bean 中,只对根据类型注入有效,
       // 如果根据名称注入,即使这边设置了 false,也是可以的
       void setAutowireCandidate(boolean autowireCandidate);
    
       // 该 Bean 是否可以注入到其他 Bean 中
       boolean isAutowireCandidate();
    
       // 主要的。同一接口的多个实现,如果不指定名字的话,Spring 会优先选择设置 primary 为 true 的 bean
       void setPrimary(boolean primary);
    
       // 是否是 primary 的
       boolean isPrimary();
    
       // 如果该 Bean 采用工厂方法生成,指定工厂名称。对工厂不熟悉的读者,请参加附录
       // 一句话就是:有些实例不是用反射生成的,而是用工厂模式生成的
       void setFactoryBeanName(String factoryBeanName);
       // 获取工厂名称
       String getFactoryBeanName();
       // 指定工厂类中的 工厂方法名称
       void setFactoryMethodName(String factoryMethodName);
       // 获取工厂类中的 工厂方法名称
       String getFactoryMethodName();
    
       // 构造器参数
       ConstructorArgumentValues getConstructorArgumentValues();
    
       // Bean 中的属性值,后面给 bean 注入属性值的时候会说到
       MutablePropertyValues getPropertyValues();
    
       // 是否 singleton
       boolean isSingleton();
    
       // 是否 prototype
       boolean isPrototype();
    
       // 如果这个 Bean 是被设置为 abstract,那么不能实例化,
       // 常用于作为 父bean 用于继承,其实也很少用......
       boolean isAbstract();
    
       int getRole();
       String getDescription();
       String getResourceDescription();
       BeanDefinition getOriginatingBeanDefinition();
    }

    beanfactory的一些属性

    1. beanDefinitionMap-(ConcrerentHashMap)

    2. singletonObject-(ConcrerentHashMap)

    3. beanDefinitionNames-(ArrayList)

    4. aliasMap-(-ConcrerentHashMap)

    5. factoryBeanObjectCache-(-ConcrerentHashMap)

    6. beanPostPcocessor-(CopyonWriteArrayList)

    Mybatis动态代理对象是如何自动注入到spring容器中的

      1. 使用beanfactory的registerXX方法来添加代理对象
      2. factoryBean可以实现把对象添加到spring容器中(这个接口很强,你可以使用动态代理)

  • 相关阅读:
    朴素贝叶斯算法(python)
    《python数据分析基础》之图与图表
    《机器学习实战》之K-近邻算法
    《机器学习实战》之决策树
    决策树算法(python)
    图像的处理
    K-近邻算法(python)
    python实现机器学习的小项目-鸢尾花
    统计学习方法概述
    《python数据分析基础》之数据库
  • 原文地址:https://www.cnblogs.com/five-five/p/13869449.html
Copyright © 2011-2022 走看看