Spring源码之BeanDefinition类的详细介绍

本篇文章给大家带来的内容是关于Spring源码之BeanDefinition类的详细介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

Spring版本为5.1.5

用过spring的人都知道,我们将对象注入到spring容器中,交给spring来帮我们管理。这种对象我们称之为bean对象。但是这些bean对象在spring容器中,到底是以什么形式存在,具有哪些属性、行为呢?今天我们进入到spring源码来一探究竟。

bean的创建工厂BeanFactory有个默认实现类DefaultListableBeanFactory,内部有个存放所有注入bean对象信息的Map

/** Map of bean definition objects, keyed by bean name. */ private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>(256);

Map的value对象BeanDefinition就是spring中对bean的定义和描述,具体概述如下:

属性 行为 解释
parentName String getParentName();
void setParentName(@Nullable String parentName);
bean定义对象的父类定义对象名称
beanClassName String getBeanClassName();
void setBeanClassName(@Nullable String beanClassName);
bean对象的实际class类
scope String getScope();
void setScope(@Nullable String scope);
bean对象是否为单例<singleton或者prototype>
lazyInit boolean isLazyInit();
void setLazyInit(boolean lazyInit);
是否懒加载
dependsOn String[] getDependsOn();
void setDependsOn(@Nullable String… dependsOn);
设置依赖的bean对象,被依赖的bean对象总是会比当前bean对象先创建
autowireCandidate boolean isAutowireCandidate();
void setAutowireCandidate(boolean autowireCandidate);
设置是否可以自动注入。只对@Autowired注解有效,配置文件中可以通过property显示注入
primary boolean isPrimary();
void setPrimary(boolean primary);
配置bean为主要候选bean。当同一个接口的多个实现类或者一个类多次注入到spring容器时,通过该属性来配置某个bean为主候选bean,通过类型来注入时,默认为使用主候选bean注入
factoryBeanName String getFactoryBeanName();
void setFactoryBeanName(@Nullable String factoryBeanName);
设置创建bean的工厂名称
factoryMethodName String getFactoryMethodName();
void setFactoryMethodName(@Nullable String factoryMethodName);
设置创建bean的工厂中,创建bean的具体方法
initMethodName String getInitMethodName();
void setInitMethodName(@Nullable String initMethodName);
设置创建bean时,默认初始化的方法
destroyMethodName String getDestroyMethodName();
void setDestroyMethodName(@Nullable String destroyMethodName);
设置销毁bean时调用的方法名称。注意需要调用context的close()方法才会调用
role int getRole();
void setRole(int role);
设置bean的分类
description String getDescription();
void setDescription(@Nullable String description);
对bean对象的描述

注意:BeanDefinition是一个接口,内部只定义了bean对象的一些基本行为。上表中的属性在BeanDefinition中并不是真实存在的,只是通过set、get方法来设置和获取。以下抽取出部分BeanDefinition源代码供大家感知下

public interface BeanDefinition extends AttributeAccessor, BeanMetadataElement {     /**      * 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(); }

实际使用

假设有以下两个bean,Java代码如下

MyTestBean

package com.yuanweiquan.learn.bean;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Description;  public class MyTestBean {     @Autowired     private AutowireCandidateBean autowireCandidateBean;      public void init() {         System.out.println("inti MyTestBean");     }      public AutowireCandidateBean getAutowireCandidateBean() {         return autowireCandidateBean;     }     public void setAutowireCandidateBean(AutowireCandidateBean bean) {         this.autowireCandidateBean = bean;     } }

AutowireCandidateBean

package com.yuanweiquan.learn.bean;  public class AutowireCandidateBean {     public void initBean() {         System.out.println("init AutowireCandidateBean");     }      public void destroyBean() {         System.out.println("destroy AutowireCandidateBean");     } }

下面看如何在配置文件applicationContext.xml来进行配置

   <bean id="myTestBean" class="com.yuanweiquan.learn.bean.MyTestBean"           depends-on="autowireCandidateBean"           init-method="init"/>              <bean id="autowireCandidateBean"           class="com.yuanweiquan.learn.bean.AutowireCandidateBean"          init-method="initBean"          autowire-candidate="true"          destroy-method="destroyBean"          scope="singleton"          parent="myTestBean"          lazy-init="default"          primary="true">       <description>autowireCandidateBean description</description>    </bean>

接下来就是测试代码

FileSystemXmlApplicationContext factory =          new FileSystemXmlApplicationContext("classpath:applicationContext.xml"); BeanDefinition myTestBeanDefinition =          factory.getBeanFactory().getBeanDefinition("autowireCandidateBean"); //输出 System.out.println("bean description:" + myTestBeanDefinition.getDescription()); System.out.println("bean class name:" + myTestBeanDefinition.getBeanClassName()); System.out.println("parent name:" + myTestBeanDefinition.getParentName()); System.out.println("scope:" + myTestBeanDefinition.getScope()); System.out.println("is lazyinit:" + myTestBeanDefinition.isLazyInit()); System.out.println("depends On:" + myTestBeanDefinition.getDependsOn()); System.out.println("is autowireCandidate:" + myTestBeanDefinition.isAutowireCandidate()); System.out.println("is primary:" + myTestBeanDefinition.isPrimary()); System.out.println("factory bean name:"+myTestBeanDefinition.getFactoryBeanName()); System.out.println("factory bean method name:" + myTestBeanDefinition.getFactoryMethodName()); System.out.println("init method name:" + myTestBeanDefinition.getInitMethodName()); System.out.println("destory method name:" + myTestBeanDefinition.getDestroyMethodName()); System.out.println("role:" + myTestBeanDefinition.getRole()); //关闭context,否则不会调用bean的销毁方法 factory.close();

控制台输出如下

init AutowireCandidateBean inti MyTestBean bean description:autowireCandidateBean description bean class name:com.yuanweiquan.learn.bean.AutowireCandidateBean parent name:myTestBean scope:singleton is lazyinit:false depends On:null is autowireCandidate:true is primary:true factory bean name:null factory bean method name:null init method name:initBean destory method name:destroyBean role:0 destroy AutowireCandidateBean

到此为止,通过上面的信息,我们能清晰的看到各属性对应的值。上述测试代码的目的是让我们大家能看到bean在spring容器中,以什么样子的形式存在,具体有哪些属性,属性的值以及默认值是多少。也算初步的揭开了spring容器中bean的面纱,其实并没有我们想象中的那么神秘。

以上就是Spring源码之BeanDefinition类的详细介绍的详细内容,更多请关注php中文网其它相关文章!

  • 相关标签:java spring
  • 本文转载于:segmentfault,如有侵犯,请联系删除
    • 上一篇:如何在Java中使用Accessor和Mutator?
    • 下一篇:Spring Security原理的介绍(附代码)

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注