spring @Profile的运用示例
@Profile的作用是把一些meta-data进行分类,分成Active和InActive这两种状态,然后你可以选择在active 和在Inactive这两种状态 下配置bean,
在Inactive状态通常的注解有一个!操作符,通常写为:@Profile("!p"),这里的p是Profile的名字。
下面demo中AppProfileConfig的bean在active状态下被IOC容器创建,而AppProfileConfig2是在Inactive状态下被IOC容器创建:
demo的思路是:先定义两个domain类,再写两个配置类即上面提的AppProfileConfig和AppProfileConfig2这两个类,最后写一个测试类:
示例代码如下:
第一个domain类:Alarm类的代码如下:
package com.timo.profile.domain; public class Alarm { private String name; private Integer alarmSeverity; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAlarmSeverity() { return alarmSeverity; } public void setAlarmSeverity(Integer alarmSeverity) { this.alarmSeverity = alarmSeverity; } }
第二个domain类:ouyangfeng的代码如下:
package com.timo.profile.domain; public class Ouyangfeng { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }
第一个配置类:AppProfileConfig的代码如下:
package com.timo.profile; import com.timo.profile.domain.Alarm; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @Profile("sixi") public class AppProfileConfig { @Bean public Alarm alarm(){ Alarm alarm = new Alarm(); alarm.setAlarmSeverity(1); alarm.setName("历史告警"); return alarm; } }
第二个配置类AppProfileConfig2的代码如下:
package com.timo.profile; import com.timo.profile.domain.Ouyangfeng; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; @Configuration @Profile("!flower") public class AppProfileConfig2 { @Bean public Ouyangfeng ouyangfeng(){ Ouyangfeng ouyangfeng = new Ouyangfeng(); ouyangfeng.setAge(25); ouyangfeng.setName("欧阳"); return ouyangfeng; } }
测试类的代码如下:
package com.timo.profile; import com.timo.profile.domain.Alarm; import com.timo.profile.domain.Ouyangfeng; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Test { public static void main(String[] args) { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
//激活@Profile中name为sixi的类: ctx.getEnvironment().setActiveProfiles("sixi"); ctx.register(AppProfileConfig.class,AppProfileConfig2.class); ctx.refresh(); Alarm alarm = ctx.getBean(Alarm.class); Ouyangfeng ouyangfeng = ctx.getBean(Ouyangfeng.class); System.out.println("alarm="+alarm); System.out.println("ouyangfeng="+ouyangfeng); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构