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

相关推荐
神之王楠3 分钟前
学习风格的类型
学习
知识分享小能手16 分钟前
mysql学习教程,从入门到精通,SQL 删除数据(DELETE 语句)(19)
大数据·开发语言·数据库·sql·学习·mysql·数据开发
白总Server30 分钟前
MongoDB解说
开发语言·数据库·后端·mongodb·golang·rust·php
计算机学姐43 分钟前
基于python+django+vue的家居全屋定制系统
开发语言·vue.js·后端·python·django·numpy·web3.py
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑1 小时前
苍穹外卖学习笔记(五)
java·笔记·学习
用生命在耍帅ㅤ1 小时前
java spring boot 动态添加 cron(表达式)任务、动态添加停止单个cron任务
java·开发语言·spring boot
张望远-长风万里1 小时前
运维监控专项学习笔记-id:0-需求场景、监控作用、监控能力
运维·笔记·学习
jun7788951 小时前
机器学习-监督学习:朴素贝叶斯分类器
人工智能·学习·机器学习
程序员-珍1 小时前
SpringBoot v2.6.13 整合 swagger
java·spring boot·后端
徐*红2 小时前
springboot使用minio(8.5.11)
java·spring boot·spring