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容器中(这个接口很强,你可以使用动态代理)