Spring注解扫描--源码解析

一、bean的定义BeanDefinition

  • BeanDefinition的含义 BeanDefinition就是用来描述一个Bean或者BeanDefinition就是Bean的定义。

    **Spirng官网描述**
    SpringIoc容器管理一个Bean或多个Bean,这些Bean通过我们提供给容器的配置元数据被创建出来(例如,在xml中的定义) 在容器中,这些Bean的定义用BeanDefinition对象来表示,
    包含以下元数据:
    
    全限定类名, 通常是Bean的实际实现类;
    Bean行为配置元素,它们说明Bean在容器中的行为(作用域、生命周期回调等等);
    Bean执行工作所需要的的其他Bean的引用,这些Bean也称为协作者或依赖项;
    其他配置信息,例如,管理连接池的bean中,限制池的大小或者使用的连接的数量。

    在Spring容器中,定义bean的方式:

  • <bean/>标签
    
    @Bean注解
    
    @Component(@Service、@Controller)

    从xml配置文件或者类路径中收集Spring需要的管理对象

    在Spring的启动过程第一步就是找到需要被管理的类,比如标注的@Configuration类

    找到之后将这些类封装到BeanDefinition对象,也就是bean,包含了这些类的全部信息BeanDefinition是一个接口,有三个实现RootBeanDefinition、ChildBeanDefinition、GenericBeanDefinition。所以也可以通过BeanDefinition这个对象定义一个bean我们通过,@Bean,@Component等方式所定义的Bean,最终都会被解析为BeanDefinition对象,所有的。

  • 使用BeanDefinition定义bean的流程:

    导入依赖:
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.6.RELEASE</version>
    </dependency>
    
    测试实体类:
    public class User {
        private Long id;
        private String name;
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void init(){
        System.out.println("初始化");
      }
    }
    
    启动类:
    public static void main(String[] args) {
      // 定义了一个BeanDefinition
      AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition()
        .getBeanDefinition();
      // 当前Bean对象的类型
      beanDefinition.setBeanClass(User.class);
      // 将BeanDefinition注册到BeanFactory中
      DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
      beanFactory.registerBeanDefinition("user", beanDefinition);
      // 获取Bean
      System.out.println(beanFactory.getBean("user"));
    }
    结果:com.gongj.entity.User@70177ecd
    
    
    **BeanDefinition可以设置其他属性**
    // 设置作用域
    beanDefinition.setScope("prototype");
    // 设置初始化方法
    beanDefinition.setInitMethodName("init");
    // 设置自动装配模型
    beanDefinition.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE); 
    结果:
    初始化
    com.gongj.entity.User@1e88b3c
    
    

    BeanDefinition继承关系

  •  AttributeAccessor:定义用于附加和访问元数据的通用协定的接口,可以是任意对象。

  • public interface AttributeAccessor {
     
      //设置属性的值(名称唯一)
      void setAttribute(String name, Object value);
     
      //获得指定属性名称的值,如果不存在返回null
      Object getAttribute(String name);
     
      //删除指定的name的属性,如果不存在则返回null
      Object removeAttribute(String name);
     
          //判断指定的属性名称是否存在
      boolean hasAttribute(String name);
     
      //返回所有属性的名称
      String[] attributeNames();
    }
    

        BeanDefinition的源码:

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {

// 单例Bean还是原型Bean
 String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON;
 String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;

// Bean角色
 int ROLE_APPLICATION = 0;  //用户自己定义的 Bean
 int ROLE_SUPPORT = 1;  //来源于配置文件的 Bean
 int ROLE_INFRASTRUCTURE = 2;//Spring 内部的 Bean

//配置 /获取父BeanDefinition的名称   XML中的 <bean parent="">
 void setParentName(@Nullable String parentName);
 @Nullable
 String getParentName();

//配置/获取 Bean 的 Class 全路径  XML 中的 <bean class="">
 void setBeanClassName(@Nullable String beanClassName);
 @Nullable
 String getBeanClassName();

//配置/获取  Bean 的作用域  XML中的 <bean scope=""> 配置。
 void setScope(@Nullable String scope);
 @Nullable
 String getScope();

//配置 / 获取 Bean 是否懒加载(默认false,立马加载)
// XML 中的 <bean lazy-init="">
 void setLazyInit(boolean lazyInit);
 boolean isLazyInit();

//配置/获取 Bean 的依赖对象  XML中的 <bean depends-on="">
 void setDependsOn(@Nullable String... dependsOn);
 @Nullable
 String[] getDependsOn();

//配置/获取 Bean 是否是自动装配的候选者 默认为 true XML中的 <bean autowire-candidate="">
 void setAutowireCandidate(boolean autowireCandidate);
 boolean isAutowireCandidate();

//如果找到了多个可注入bean,那么则选择被Primary标记的bean/获取当
//前 Bean 是否为首选的 Bean  XML中的 <bean primary="">
 void setPrimary(boolean primary);
 boolean isPrimary();

// 配置/获取 FactoryBean 的名字  XML中的<bean factory-bean="">
 void setFactoryBeanName(@Nullable String factoryBeanName);
 @Nullable
 String getFactoryBeanName();

//配置/获取 FactoryMethod 的名字,可以是某个实例的方法(和factoryBean配合使用)
//也可以是静态方法。 XML 中的<bean factory-method=""> 
 void setFactoryMethodName(@Nullable String factoryMethodName);
 @Nullable
 String getFactoryMethodName();

//返回该 Bean 构造方法的参数值
 ConstructorArgumentValues getConstructorArgumentValues();

//判断 getConstructorArgumentValues 是否是空对象。
 default boolean hasConstructorArgumentValues() {
  return !getConstructorArgumentValues().isEmpty();
 }

//获取普通属性的集合
 MutablePropertyValues getPropertyValues();

//判断 getPropertyValues 是否为空对象
 default boolean hasPropertyValues() {
  return !getPropertyValues().isEmpty();
 }

// 配置/获取 Bean 的初始化方法 XML中的<bean init-method="">
 void setInitMethodName(@Nullable String initMethodName);
 @Nullable
 String getInitMethodName();

// 配置/获取 Bean 的销毁方法  XML中的<bean destroy-method="">
 void setDestroyMethodName(@Nullable String destroyMethodName);
 @Nullable
 String getDestroyMethodName();

//配置/获取 Bean的角色
 void setRole(int role);
 int getRole();

//配置/获取 Bean 的描述
 void setDescription(@Nullable String description);
 @Nullable
 String getDescription();

//用来解析一个Bean对应的类型上的各种信息,比如泛型
 ResolvableType getResolvableType();

//是否为单例
 boolean isSingleton();

// 是否为原型
 boolean isPrototype();

//是否抽象  XML 中的<bean abstract="true">
 boolean isAbstract();

//返回定义 Bean 的资源描述
 @Nullable
 String getResourceDescription();

// 如果当前 BeanDefinition 是一个代理对象,那么该方法可以用来返回原始的 BeanDefinition
 @Nullable
 BeanDefinition getOriginatingBeanDefinition();
}

具体关系图:

一、先说AbstractBeanDefinition AbstractBeanDefinition是一个抽象类,在BeanDefinition接口中只定义了get和set方法, 没有提供属性,具体的属性在AbstractBeanDefinition中定义

  • 1、源码

```Java
public abstract class AbstractBeanDefinition extends 
BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {

  //默认作用域名称的常量:等效于单例
  public static final String SCOPE_DEFAULT = "";
  
  //自动装配的一些常量
  // autowireMode  = 0,默认值,未激活Autowiring。
  // bean 标签的 autowire 属性值为 no
  // 1、在xml中需要手动指定依赖注入对象 配置 property标签或者 constructor-arg标签
  // 2、使用 @Autowired 注解,autowireMode 的值也是 0
  public static final int AUTOWIRE_NO = AutowireCapableBeanFactory.AUTOWIRE_NO;
  
  //autowireMode  = 1,根据set方法的的名称作为Bean名称进行依赖查找
  //(去掉set,并尝试将首字母变为小写),并将对象设置到该set方法的参数上
  // bean 标签的 autowire 属性值配置为 byName
  public static final int AUTOWIRE_BY_NAME = 
  AutowireCapableBeanFactory.AUTOWIRE_BY_NAME;
  
  //autowireMode  = 2,根据set方法参数的类型作为Bean类型进行依赖查找
  //并将对象设置到该set方法的参数上
  // bean 标签的 autowire 属性值配置为 byType
  public static final int AUTOWIRE_BY_TYPE = 
  AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE;
  
  //autowireMode  = 3,构造器注入
  // bean 标签的 autowire 属性值配置为 constructor
  public static final int AUTOWIRE_CONSTRUCTOR = 
  AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR;
  
  //表明通过Bean的class的内部来自动装配 Spring3.0被弃用。
  // bean 标签的 autowire 属性值配置为 autodetect
  @Deprecated
  public static final int AUTOWIRE_AUTODETECT = 
  AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT;
  
  //检查依赖是否合法,在本类中,默认不进行依赖检查
  //不进行检查
  public static final int DEPENDENCY_CHECK_NONE = 0;
  
  //对对象引用进行依赖性检查
  public static final int DEPENDENCY_CHECK_OBJECTS = 1;
  
  //对“简单”属性进行依赖性检查
  public static final int DEPENDENCY_CHECK_SIMPLE = 2;
  
  //对所有属性进行依赖检查
  public static final int DEPENDENCY_CHECK_ALL = 3;
  
  //若Bean未指定销毁方法,容器应该尝试推断Bean的销毁方法的名字,
  //目前,推断的销毁方法的名字一般为close或是shutdown
  public static final String INFER_METHOD = "(inferred)";
  
  //Bean的class对象或是类的全限定名
  @Nullable
  private volatile Object beanClass;
  
  //默认的scope是单例,对应bean属性scope
  //@Scope
  @Nullable
  private String scope = SCOPE_DEFAULT;
  
  //是否是抽象,对应bean属性abstract
  private boolean abstractFlag = false;
  
  //是否懒加载,对应bean属性lazy-init,默认不是懒加载
  //@Lazy
  @Nullable
  private Boolean lazyInit;
  
  //自动注入模式,对应bean属性autowire,默认不进行自动装配
  private int autowireMode = AUTOWIRE_NO;
  
  //是否进行依赖检查,默认不进行依赖检查
  private int dependencyCheck = DEPENDENCY_CHECK_NONE;
  
  //用来表示一个bean的实例化是否依靠另一个bean的实例化,先加载dependsOn的bean,
  //对应bean属性depend-on
  //@Dep
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值