0

0

Spring源码之BeanDefinition类的详细介绍

不言

不言

发布时间:2019-03-22 16:38:56

|

3918人浏览过

|

来源于segmentfault

转载

本篇文章给大家带来的内容是关于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 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对象是否为单例
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来进行配置

思高网络商城CycooShop
思高网络商城CycooShop

主要模块:首页商品推荐 /顾客留言发布 /商品分类浏览 /按商品分类、关键字搜索商品 /商品购物车 人信息中心 /显示商品详细介绍以及多图片显示功能 /商品类别管理有分大类中类的类别设定商品搜索类别设定 /商品管理有临时关闭不在线功能 /订单管理 /支付类型管理模块 留言管理 /后台权限分级管理 /密码修改 /新闻管理 /网站配置管理 /滚动广告管理v1.58更新:1、增强支付接口设置。2、内置支

下载
   
         
   
      autowireCandidateBean description
   

接下来就是测试代码

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的面纱,其实并没有我们想象中的那么神秘。

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

84

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

24

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

56

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

9

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

26

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 2.6万人学习

C# 教程
C# 教程

共94课时 | 6.9万人学习

Java 教程
Java 教程

共578课时 | 47.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号