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

相关推荐
程序员爱钓鱼15 分钟前
Go语言实战案例-简易计算器(加减乘除)
后端
学不会就看20 分钟前
Django--01基本请求与响应流程
后端·python·django
数字芯片实验室5 小时前
分享一个可以学习正则表达式的网址:Pythex.org
学习·正则表达式
Nejosi_念旧6 小时前
解读 Go 中的 constraints包
后端·golang·go
陈洪奇6 小时前
注册中心学习笔记整理
笔记·学习
风无雨6 小时前
GO 启动 简单服务
开发语言·后端·golang
小明的小名叫小明6 小时前
Go从入门到精通(19)-协程(goroutine)与通道(channel)
后端·golang
光影少年6 小时前
从前端转go开发的学习路线
前端·学习·golang
斯普信专业组6 小时前
Go语言包管理完全指南:从基础到最佳实践
开发语言·后端·golang
ladymorgana7 小时前
【spring boot】三种日志系统对比:ELK、Loki+Grafana、Docker API
spring boot·elk·grafana