@Profile bean环境隔离

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。@Profile bean环境隔离,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

先看一段配置

spring:
  main:
# 允许名称相同的bean相互覆盖
    allow-bean-definition-overriding: true
  profiles:
# 当前环境是dev
    active: dev

多环境支持的依赖是org.springframework.cloud:spring-cloud-context
如果引入了com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery则不用引入了,原因是依赖传递

像上面的配置之后我们的配置文件可能还有像bootstrap-dev.yml``bootstrap-release.yml这样命名的配置文件

这些配置文件就是用于区分多环境配置的配置文件主要看横线后面的

好,到现在已经做到了配置的环境隔离。如果想要bean在不同的环境也不同呢?

这时候@Profile就登场了,惯例先看源码😁

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(ProfileCondition.class)
public @interface Profile {

	/**
	 * The set of profiles for which the annotated component should be registered.
	 */
	String[] value();

}

The @Profile annotation may be used in any of the following ways:

  • as a type-level annotation on any class directly or indirectly annotated with @Component, including @Configuration classes
  • as a meta-annotation, for the purpose of composing custom stereotype annotations
  • as a method-level annotation on any @Bean method

以上说明来自源码

说明了注解@Profile可以用来那些地方
从源码的@Target({ElementType.TYPE, ElementType.METHOD})也可以知晓
该注解可以用在类、接口、枚举、注解、方法上

Indicates that a component is eligible for registration when one or more specified profiles are active.
意思是当一个或多个指定的配置文件处于活动状态的时候符合注册条件
符合什么注册条件呢?答案是:bean的注册条件

如何使用呢?再看一些代码
spring.profiles.active=dev

/**
 * @author YinShangWen
 * @since 2023/2/18 10:47
 */
public interface DemoService {
}
/**
 * @author YinShangWen
 * @since 2023/2/18 10:49
 */
@Service
@Profile("dev")
public class DemoServiceImplDev implements DemoService {
}
/**
 * @author YinShangWen
 * @since 2023/2/18 10:49
 */
@Service
@Profile("release")
public class DemoServiceImpl implements DemoService {
}

这时候如果运行起来beanDemoServiceImpl还是DemoServiceImplDev呢?
这里就要看@Profile的value是什么了,像上面配置了spring.profiles.active=dev那么注册的就是携带注解@Profile("dev")bean也就是DemoServiceImplDev

到这里基本使用就完成了
不知道有没有同学思考一个问题,如果想上面类似的代码很多的时候是不是每次都需要写@Profile("xxx")
有时候一不小心把value中的内容写错一个字母就会出现找不到bean的bug了

怎么解决呢?也比较简单,就是用@Profile("xxx")修饰一个注解然后我们使用的时候就用自定义出来的注解就行了。废话不多说看代码

/**
 * @author YinShangWen
 * @since 2023/2/18 9:34
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Profile("release")
public @interface Release {
}
/**
 * @author YinShangWen
 * @since 2023/2/18 9:39
 */
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Profile({"dev", "uat"})
public @interface Dev {
}

这里我定义了两个自定义注解分别是ReleaseDev
用途分别是在环境是release 的时候注册和环境是devuat的时候注册
如何使用?大致用法和@Profile差不多就是省略了写value。
这样就可以避免上面说到的粗心的问题了

完😏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/195206.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!