前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring 中的@Profile 注解的作用是什么?

Spring 中的@Profile 注解的作用是什么?

作者头像
水货程序员
修改2018-12-03 16:19:29
4.1K0
修改2018-12-03 16:19:29
举报
文章被收录于专栏:javathingsjavathingsjavathings

@Profile 注解的作用在不同的场景下,给出不同的类实例。比如在生产环境中给出的 DataSource 实例和测试环境给出的 DataSource 实例是不同的。

@Profile 的使用时,一般是在@Configuration 下使用,标注在类或者方法上,标注的时候填入一个字符串(例如”dev”),作为一个场景, 或者一个区分。在 Spring 中,配置 Profile 为 dev 时,就可以获取到这个 bean 了。

例子

比如,实现一个数据源,在 dev 环境和在 pro 环境下,返回的对象是不同的。

接口DataSource

package com.myjava.demo;
 
public interface DataSource {
    public String name() ;
}

dev 的 DataSource 和 pro 的 DataSource 分别是 2 个不同的实现

表示dev环境的DataSource

package com.myjava.demo;
 
public class DataSourceDev implements DataSource {
	public String mySource() {
		return "这是dev";
	}
}

表示pro环境的DataSource

package com.myjava.demo;
 
public class DataSourcePro implements DataSource {
	public String mySource() {
		return "这是pro";
	}
}

使用了一个配置类,基于@Configuration 标注,配置里面,用了@Profile,分别表示了哪个对象作用于哪个环境

配置 。

package com.myjava.demo;
 
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
 
@Configuration
public class Config {
	@Bean(name = "dataSource")
	@Profile("dev")
	public DataSource getDataSourceDev() {
		return new DataSourceDev();
	}
 
	@Bean(name = "dataSource")
	@Profile("pro")
	public DataSource getDataSourcePro() {
		return new DataSourcePro();
	}
}

在 Main 方法中,调用 dataSource.mySource() 的时候,会根据设定的 ActiveProfiles 来匹配相应的对象。

Main方法

package com.myjava;
 
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
import com.myjava.demo.*;
 
public class Application {
	public static void main(String[] args) {
		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
		context.register(Config.class);
		context.getEnvironment().setActiveProfiles("dev");
		context.refresh();
 
		DataSource dataSource = (DataSource) context.getBean("dataSource");
		System.out.println(dataSource.mySource());
		
		context.close();
	}
 
}

实际上,很少通过上面的方式激活 Spring 容器中的 Profile,通常都是让 Spring 容器自动去读取 Profile 的值,然后自动设置。这些实现通常是和具体框架实现,或者虚拟机参数,环境变量等相关。比如:作为 SpringMVC 中的 DispatcherServlet 的初始化参数,作为 Web 应用上下文中的初始化参数,或者使用@AtivceProfile 来进行激活。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档