参考文章:https://blog.csdn.net/zhr2376494700/article/details/139664396
每一次在使用配置类时,都是按照流程,给类添加注解、写一个方法添加@Bean注解将返回对象作为bean进行注册,但是为什么要用这种形式,Spring boot提供这种形式的配置类为了解决什么问题呢?
首先明确配置类的目的,配置类就是用于注册一个Bean的,只不过有些Bean在初始化的过程中需要获取一些配置信息,装配好后才能完成初始化进入ioc容器。 配置类就是为提供了添加初始化逻辑的位置。因此我们可以理解为:@Configuration声明的配置类就起到了一个代替配置文件(yml、xml)的作用。
使用规则
Spring Boot 推荐我们使用@Configuration全注解的方式加载 Spring 配置,其实现方式如下:
- 使用 @Configuration 注解定义配置类,替换 Spring 的配置文件;
- 配置类内部可以包含有一个或多个被 @Bean 注解的方法,这些方法会被AnnotationConfigApplicationContext 或
AnnotationConfigWebApplicationContext 类扫描,构建 bean 定义(相当于 Spring配置文件中的标签),方法的返回值会以组件的形式添加到容器中,组件的 id 就是方法名。
由此我们看出配置类就是用于注册Bean的,只不过这个Bean注册是需要添加很多逻辑,比如从properties文件中获取一些值等,因此用配置类这种形式直接注册组装好的Bean。例如:RedisTemplate,在配置类中直接提前组装好序列化器在注册成Bean。这样用户使用时就不用手动指定了。
@Conditional注解
通过上述我们知道程序启动时,会将配置类中的Bean进行注册,但是一个项目以及它依赖的各种jar包 中有n多个配置类,每次启动时都把他们一次性加载到 IOC 吗?
肯定不会的,不然会存在太多注册但是没用的Bean,很浪费资源。因此很多配置类都会结合@Condition注解根据条件判断来决定程序启动时是否要加载当前配置类。(一般常见的条件有:某某类存不存在等 。
常见Condition注解:
@ConditionalOnBean:当有指定Bean的条件下@ConditionalOnClass:当有指定的类的条件下
@ConditionalOnCloudPlatform:当使用云平台是
@ConditionalOnExpression:当表达式为true时才去实例化
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnJndi:在JNDI存在的条件下查找指定的位置
@ConditionalOnMissingBean:当没有指定Bean的情况下
@ConditionalOnMissingClass:当没有指定类的情况下
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件下
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnOnSingleCandidate:当指定Bean在容器中只有一个,或者有多个但是指定首选的Bean
@ConditionalOnWarDeployment 当是以war打包条件下
@ConditionalOnWebApplication:当前项目是Web项目的条件下
例如:只有rocketMQ存在,rocketMQUtil才会加载(只是一个例子,不一定有这两个类))