SpringBeanDefinition详解

在Spring框架中,Bean是重要的资源,每个Bean在容器中都应该有一个对应的BeanDefinition对象,它是Spring中定义和封装Bean配置元数据的中心描述符。BeanDefinition对象是Spring中IoC容器创建、装配和管理Bean的核心类,掌握BeanDefinition及其相关的属性和方法,有助于深入理解Spring框架的设计思想和核心功能。

一、获取BeanDefinition对象

在Spring框架中,获取BeanDefinition对象常见的方式有三种:

1、使用BeanFactory接口或ApplicationContext接口中的getBeanDefinition方法获取指定Bean的BeanDefinition对象;

BeanDefinition bd = factory.getBeanDefinition("beanName"); //通过Bean名称获取BeanDefinition
BeanDefinition bd = factory.getBeanDefinition(BeanClass.class); //通过Bean类型获取BeanDefinition

2、使用ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等XmlApplicationContext实现类创建Spring容器,通过BeanDefinitionReader或BeanDefinitionParser解析读取xml中的配置信息,然后生成BeanDefinition对象;

@Bean
public BeanDefinitionReader beanDefinitionReader() throws Exception {
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory());
    reader.loadBeanDefinitions(new ClassPathResource("beans.xml"));
    return reader;
}

3、通过BeanDefinitionBuilder创建和修改BeanDefinition对象。

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class);
builder.addPropertyValue("propertyName", "propertyValue");
builder.setScope(BeanDefinition.SCOPE_SINGLETON);
BeanDefinition bd = builder.getBeanDefinition();

二、Bean的作用域

在Spring框架中,Bean通过Scope属性来定义Bean的作用域,Spring框架提供了以下五种作用域:

1、singleton:单例模式,容器中只存在一个Bean实例,默认作用域;

2、prototype:原型模式,每次请求Bean时,都会创建一个新的Bean实例;

3、request:针对Web应用,每个Http请求都会创建一个新的Bean实例;

4、session:针对Web应用,每个Http Session会创建一个新的Bean实例;

5、globalSession:针对Web应用,全局Http Session会创建一个新的Bean实例。

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class);
builder.setScope(BeanDefinition.SCOPE_PROTOTYPE);
BeanDefinition bd = builder.getBeanDefinition();

三、Bean的声明周期

在Spring框架中,Bean生命周期可以被分为以下七个阶段:

1、实例化Bean:Spring容器根据BeanDefinition的配置信息创建一个Bean实例;

2、设置对象属性:Spring容器根据BeanDefinition的配置信息将属性或引用注入到Bean中;

3、调用BeanPostProcessor的postProcessBeforeInitialization()方法:BeanPostProcessor是Spring框架提供的接口,用于对Bean进行初始化前后的处理工作;

4、调用InitializingBean接口的afterPropertiesSet()方法或者在xml文件中配置init-method方法:该方法在Bean的所有属性被设置之后调用,完成其他的初始化工作;

5、调用BeanPostProcessor的postProcessAfterInitialization()方法:如果这个Bean是SmartInitializingSingleton或者SmartLifecycle接口的实现类并且被注册了,直接进入第七步;

6、Bean可以使用了:Bean正在工作当中;

7、调用SmartLifecycle的start()方法或SmartInitializingSingleton的afterSingletonsInstantiated()方法:如果Bean实现了SmartLifecycle接口,那么在Spring启动时,自动调用start()方法使Bean处于运行状态;如果Bean实现了SmartInitializingSingleton接口,那么在所有Bean都初始化完成后,调用afterSingletonsInstantiated()方法。

@Component
public class ExampleBean implements InitializingBean, DisposableBean, SmartInitializingSingleton, SmartLifecycle {
    //...
    @Override
    public void afterSingletonsInstantiated() {
        log.info("Executing afterSingletonsInstantiated()");
    }
    @Override
    public void start() {
        log.info("Executing start()");
    }
    //...
}

四、Bean的依赖关系

Spring框架中,Bean之间的依赖关系通常通过BeanDefinition对象中的DependsOn属性、@Autowired注解和@Resource注解来完善。

1、DependsOn属性:用于强制提前初始化特定Bean依赖的Bean;

BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(BeanClass.class);
builder.getBeanDefinition().setDependsOn(new String[]{"dependentBean"});

2、@Autowired注解:将其他Bean作为属性注入到当前Bean中,以创建依赖关系;

@Component
public class ExampleBean {
    @Autowired
    private OtherBean otherBean;
    //...
}

3、@Resource注解:类似@Autowired注解,用于将其他Bean作为属性注入到当前Bean中,可以指定Bean的名称或者类型。

@Component
public class ExampleBean {
    @Resource(name = "otherBean")
    private OtherBean otherBean;
    //...
}

五、Bean的元数据

Spring框架中,Bean元数据是指Bean的详细描述信息,包括Bean的类名、作用域、构造参数、属性、依赖等。Spring提供了多种方式来定义Bean元数据。

1、xml方式:通过定义xml文档,在xml元素中声明Bean元数据;


    

2、JavaConfig方式:使用JavaConfig方式定义Bean元数据,通过@Configuration注解标记JavaConfig类,使用@Bean注解定义Bean;

@Configuration
public class AppConfig {
    @Bean
    public ExampleBean exampleBean(){
        ExampleBean exampleBean = new ExampleBean();
        exampleBean.setPropertyName("propertyValue");
        return exampleBean;
    }
}

六、Bean的后置处理器

在Spring框架中,Bean的后置处理器是指在Bean生命周期中,在Bean属性注入、Bean初始化前后等阶段对Bean进行定制化操作的处理器。Spring框架提供了如下的Bean后置处理器接口:

1、BeanPostProcessor:所有Bean后置处理器都需要实现该接口;

2、InstantiationAwareBeanPostProcessor:继承BeanPostProcessor接口,用来在Bean实例化前后对Bean进行特殊处理,例如Bean自动装载、AOP功能实现;

3、BeanFactoryPostProcessor:在BeanFactory容器实例化完成之后,BeanFactoryPostProcessor接口会先于其他Bean被实例化,用于对BeanFactory容器进行post-processing操作。

public class ExampleBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        //执行Bean初始化前的操作
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        //执行Bean初始化后的操作
        return bean;
    }
}

七、总结

本文详细介绍了Spring框架中BeanDefinition的相关概念,包括获取BeanDefinition对象、Bean的作用域、Bean的声明周期、Bean的依赖关系、Bean的元数据和Bean的后置处理器等。Spring框架通过BeanDefinition对象的封装和管理,实现对Bean的自动装配、托管、管理等核心功能,使得Spring框架应用更加简单、更加灵活、更加高效。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/157799.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-18 20:02
下一篇 2024-11-18 20:02

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25

发表回复

登录后才能评论