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

相关推荐
短剑重铸之日6 分钟前
《SpringCloud实用版》Stream + RocketMQ 实现可靠消息 & 事务消息
后端·rocketmq·springcloud·消息中间件·事务消息
没有bug.的程序员10 分钟前
Spring Boot 事务管理:@Transactional 失效场景、底层内幕与分布式补偿实战终极指南
java·spring boot·分布式·后端·transactional·失效场景·底层内幕
华农第一蒟蒻17 分钟前
一次服务器CPU飙升的排查与解决
java·运维·服务器·spring boot·arthas
科技林总20 分钟前
【系统分析师】5.7 数据挖掘技术
学习
m0_7482299926 分钟前
帝国CMS后台搭建全攻略
java·c语言·开发语言·学习
LuminescenceJ1 小时前
GoEdge 开源CDN 架构设计与工作原理分析
分布式·后端·网络协议·网络安全·rpc·开源·信息与通信
Tony Bai1 小时前
【分布式系统】11 理论的试金石:用 Go 从零实现一个迷你 Raft 共识
开发语言·后端·golang
闻哥1 小时前
从 AJAX 到浏览器渲染:前端底层原理与性能指标全解析
java·前端·spring boot·ajax·okhttp·面试
短剑重铸之日1 小时前
《SpringCloud实用版》统一认证授权:Spring Authorization Server + OAuth2 + JWT 生产级方案
java·后端·spring·jwt·oauth2
浮尘笔记2 小时前
Go语言并发安全字典:sync.Map的使用与实现
开发语言·后端·golang