springboot的学习(四):bean的加载和控制

简介

主要是加载bean的方式已经加载bean的控制

spring加载bean方式

  • 在xml中使用bean标签声明bean,启动类中使用ClassPathXmlApplicationContext加载xml
  • 在xml中自定义命名空间,配置自动扫描,对于加载自定义的bean,在类上添加@component注解,对于加载第三方的bean,使用配置类的方式,在类上添加@configuration,方法上添加@bean。启动类中也是使用ClassPathXmlApplicationContext加载xml
  • 配置类方式,写个配置类,使用@ComponentScan注解修饰,指定扫描哪些包,启动类上使用AnnotationConfigApplicationContext加载配置类。其他和第二种类似
  • 在配置类中,使用@import("类名.class")注解,可以导入对应的类对象进spring容器。这种方式不用在类上使用注解来声明。可以解耦。也可以导入其他的配置类,配置类中定义的bean也会被导入。
  • 使用上下文对象在容器初始化完成后注入bean,容器对象名.register(类名.class),这个容器对象只能是AnnotationConfigApplicationContext
  • 写一个类a实现ImportSelector接口,实现里面的selectImports方法,方法里面可以传入数组,元素是全路径类名,再写一个配置类,类上使用@Import(a.class),就可以加载这些类对象进容器中。这个方法中的参数AnnotationMetaData就是配置类的信息,类似于反射,可以获得配置类的各种信息,是否有某个注解,某个属性等。springboot源码中有大量的应用
  • 写一个类b实现ImportBeanDefinitionRegistrar,重写里面的registerBeanDefinitions方法,这个方法里面有两个参数,AnnotationMetadata和BeanDefinitionRegistey。AnnotationMetadata和上一中方式类似,可以获得配置类的各种信息,这个BeanDefinitionRegistey可以注册BeanDefinition。通过BeanDefinition的注册器注册实名bean,实现对容器中bean的绑定。也需要在配置类中使用@Import引入这个b类。可以实现对现有bean的覆盖
  • 写个c类实现BeanDefinitionRegistoryPostProcessor接口,里面有个方法postProcessBeanDefinitionRegistory方法,也是注册BeanDefinition注册器的,可以实现对容器中bean的最终裁定。第三方的bean是兜底用的,当自己没有实现的时候,就用它,但如果自己实现了bean,那就会通过BeanDefinitionRegistoryPostProcessor这个接口注册bean,这就是最终的使用的bean

@ImportResource

整合系统或者系统迁移的时候,可能不能修改原来的代码(源码或者jar包),可以写一个配置类,使用@ImportResource("配置文件名")注解,启动类上使用AnnotationConfigApplicationContext加载配置类,spring容器就可以把之前的配置文件中的的bean放到同一个容器中

bean的加载控制

可以根据特定情况对bean进行选择性加载。

控制只适用以下加载bean的方式:

  • AnnotationConfigApplicationContext调用register方法
  • @Improt导入ImportSelector接口
  • @Import导入ImportBeanDefinitionRegistrar接口
  • @Import导入BeanDefinitionRegistryPostProcessor接口

@ConditionalOnClass

可以使用@ConditionalOnClass(name="类路径")进行控制,当有这个类路径下的类的时候,才加载这个注解修饰的bean。

@ConditionalOnMissingClass

@ConditionalOnMissingClass("类路径")修饰bean,当没有这个类路径下的类的时候,才加载这个注解修饰的bean。

@ConditionalOnBean

@ConditionalOnBean(name="bean的名字"),有指定的名字的bean的时候才加载这个注解修饰的bean。

扩展

这些可以组合使用,还有很多conditionalon。。。的注解。这些注解依赖于springboot。可以放到bean的类上,也可以放到配置类上。

相关推荐
Hello_Embed1 天前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中1 天前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Magnetic_h1 天前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
hdsoft_huge1 天前
Java & Spring Boot常见异常全解析:原因、危害、处理与防范
java·开发语言·spring boot
研梦非凡1 天前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi1383921 天前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手1 天前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
用户21411832636021 天前
Qwen3-Coder 实战!历史人物短视频一键生成,多分镜人物不崩,魔搭直接玩
后端
追逐时光者1 天前
C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)
后端·.net
追逐时光者1 天前
C#/.NET/.NET Core编程技巧练习集,配套详细的文章教程讲解!
后端·.net