spring BeanDefinition

spring 中的 BeanDefinition

1.定义: BeanDefinition 是spring中组成元素单元,描述了一个bean实例,它具有属性值、构造函数参数值以及由具体实现提供的其他信息。这只是一个最小的接口:主要目的是允许一个BeanFactoryPostProcessor检查和修改属性值和其他bean元数据。
2.结构:
在这里插入图片描述
BeanDefinition 继承 AttributeAccessor 和 BeanMetadataElement,
AttributeAccessor:定义了或者任意对象的附加属性的操作。

public interface AttributeAccessor {
    void setAttribute(String var1, Object var2);
    Object getAttribute(String var1);
    Object removeAttribute(String var1);
    boolean hasAttribute(String var1);
    String[] attributeNames();
}

BeanMetadataElement : BeanDefinition元数据,返回该Bean的来源

public interface BeanMetadataElement {
    Object getSource();
}

3.源码

package org.springframework.beans.factory.config;

import org.springframework.beans.BeanMetadataElement;
import org.springframework.beans.MutablePropertyValues;
import org.springframework.core.AttributeAccessor;

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;

   
   void setParentName(String parentName);// 设置父 Bean,这里涉及到 bean 继承,不是 java 继承。

   String getParentName();// 获取父 Bean

   void setBeanClassName(String beanClassName); // 设置 Bean 的类名称,将来是要通过反射来生成实例的

   String getBeanClassName();// 获取 Bean 的类名称

   void setScope(String scope); // 设置 bean 的 scope

   String getScope();
   
   void setLazyInit(boolean lazyInit);// 设置是否懒加载

   boolean isLazyInit();// 是否是懒加载

   // 设置该 Bean 依赖的所有的 Bean,注意,这里的依赖不是指属性依赖(如 @Autowire 标记的),
   // 是 depends-on="" 属性设置的值。
   void setDependsOn(String... dependsOn);
 
   String[] getDependsOn();// 返回该 Bean 的所有依赖

   // 设置该 Bean 是否可以注入到其他 Bean 中,只对根据类型注入有效,
   // 如果根据名称注入,即使这边设置了 false,也是可以的
   void setAutowireCandidate(boolean autowireCandidate);
 
   boolean isAutowireCandidate();// 该 Bean 是否可以注入到其他 Bean 中

   // 主要的。同一接口的多个实现,如果不指定名字的话,Spring 会优先选择设置 primary 为 true 的 bean
   void setPrimary(boolean primary);

   
   boolean isPrimary();// 是否是 primary 的

   // 如果该 Bean 采用工厂方法生成,指定工厂名称。对工厂不熟悉的读者,请参加附录
   // 一句话就是:有些实例不是用反射生成的,而是用工厂模式生成的
   void setFactoryBeanName(String factoryBeanName);
   
   String getFactoryBeanName();// 获取工厂名称
   
   void setFactoryMethodName(String factoryMethodName);// 指定工厂类中的 工厂方法名称
   
   String getFactoryMethodName();// 获取工厂类中的 工厂方法名称
 
   ConstructorArgumentValues getConstructorArgumentValues();// 构造器参数
 
   MutablePropertyValues getPropertyValues();// Bean 中的属性值,后面给 bean 注入属性值的时候会说到
 
   boolean isSingleton();// 是否 singleton
 
   boolean isPrototype();// 是否 prototype

   // 如果这个 Bean 是被设置为 abstract,那么不能实例化,
   // 常用于作为 父bean 用于继承,其实也很少用......
   boolean isAbstract();

   int getRole();
   String getDescription();
   String getResourceDescription();
   BeanDefinition getOriginatingBeanDefinition();
}

4.BeanDefinition的实现
在这里插入图片描述

  1. AbstractBeanDefinition    //抽象类统一实现了BeanDefinition定义的一部分操作
  2. RootBeanDefinition    //根据xml,JavaConfig配置的Bean
  3. ChildBeanDefinition   //可以让子BeanDefinition定义拥有从父母哪里继承配置的能力
  4. GenericBeanDefinition   //可以动态设置父bean

    除此之外,BeanDefinition还有一个扩展的接口AnnotatedBeanDefinition,表示使用注解配置的Bean这个接口有两个重要的属性,AnnotationMetadata,MethodMetadata分别表示BeanDefinition的注解元信息和方法元信息 实现了此接口的BeanDefinition可以获取到注解元数据和方法元数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值