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的类上,也可以放到配置类上。

相关推荐
Code blocks30 分钟前
GB28181视频服务wvp部署(一)
java·spring boot·后端
我命由我1234536 分钟前
Spring Boot - Spring Boot 静态资源延迟响应(使用拦截器、使用过滤器、使用 ResourceResolver)
java·spring boot·后端·spring·java-ee·intellij-idea·intellij idea
华仔啊1 小时前
3 分钟让你彻底搞懂 Spring 观察者和发布者模式的本质区别
java·后端
言之。1 小时前
LiteLLM:让LLM调用变得简单统一
后端·python·flask
张永清-老清1 小时前
每周读书与学习->JMeter主要元件详细介绍(一)配置元件
学习·jmeter·性能调优·jmeter性能测试·性能分析·干货分享
驰羽1 小时前
[GO]golang接口入门:从一个简单示例看懂接口的多态与实现
开发语言·后端·golang
ZhengEnCi1 小时前
Python_try-except-finally 完全指南-从异常处理到程序稳定的 Python 编程利器
后端·python
鼾声鼾语2 小时前
grootN1 grootN1.5 gr00t安装方法以及使用(学习)
学习·angular.js·simulink·isaacsim·isaaclab
程序员小假2 小时前
我们来说一说 Redisson 的原理
java·后端