spring web运行时根据不同profile的配置,选择性的加载组件(bean)

Spring Boot WebTestClient 500错误排查:从日志调试到环境配置 在微服务架构中,集成测试是确保系统稳定性的关键环节。Spring Boot的WebTestClient作为测试响应式Web应用的工具,其底层通过模拟HTTP请求处理链来验证接口逻辑。然而,当测试环境配置不当或应用上下文加载异常时,常会引发隐蔽的500内部服务器错误,导致错误信息缺失,仅返回空响应体或简略的请求ID。这类问题通常源于Bean创建失败、依赖注入异常或日志级别设置不当,使得异常堆栈被“吞没”,难以定位根源。从工程实践角度,开发者需掌握激活DEBUG日志、检查ApplicationContext健康 阅读详情

        本文的实践方案其实很久之前就已经实现了(其想法跟实践从主要点来看都非常的简洁),由于我一直想将此方案应用于企业应用中并形成一个比较基础的应用框架,因此关于本方案的文档化拖了很久都没有形成。

        运行时加载组件其实是个老生常谈的话题了。比较早的windows桌面应用(最新的桌面应用实现此功能应该更不是事儿了)中,无论是功能组件还是窗口组件,在项目方案定义完接口后,主框架利用LoadLibrary、FreeLibrary等,在运行时(runtime),由用户从某位置选载到func/window.dll组件文件,然后加载到应用中,完成主框架、功能框架的对接以及功能的运行时添加。如下图。

        由上面的思路,本文介绍的主题是:在spring web应用中,如何做到在启动运行时,根据用户设定的应用配置,让spring框架选择性的加载组件(或者创建bean)。

 

我把上面这段主题的“例子”单列出来:

        比如,你有个web应用项目,是个小型oa管理系统,一般来说,你在idea中使用spring mvc创建一个工程后,为了实现信息持久化,你需要连接数据库;为了实现oa流程,你需要依赖activiti之类的bpm框架;为了实现某些场景的定时任务(比如每月一次的加班审报邮件确认),你需要依赖quartz之类的调度框架;等等。无论这些功能框架有没有类似springboot下面的starter,你都可以自己造一些与这些框架或者组件适配的***Configuration,然后使用@Configuration注解,在应用运行时,创建这些框架相关的bean。

        上面这里的问题是,一旦你选择了让功能框架添加进来,那启动应用后,按照基本的默认情况,这些bean是必然是被创建的,启动之后数据库相关的bean、相对庞大的activiti、时不时出现的quartz日志(为了调试,你总是会输出一些东西吧?),将会通过控制台告诉你他们还活着。

        然而,我们当前其实就是想做一个crud页面的前后端联试,看看页面是否正常,根本不需要那些数据库、流程、调度框架现身。

        spring当然已经提供了@Conditional注解来告诉我们可以选择了,然而spring考虑的仍然是普适,在一向需要定制的企业应用中,如果不在已有的基础上进行增强,多半是满足不了业务需求的(对开发来说,我们这里是需要专一性):我们仍然是希望于通过一个简单的外部配置参数(不同profile)来修改应用的状态,而不是修改pom.xml中的依赖或者修改类的实现。

 

        本文就是介绍如何在spring web中,通过增强spring以实现以上场景中的“专一”开发的(即若是你多人开发,一人前端,一人流程,一人调度,各自pull下来的都是同一份程序,仅本地配置文件的值不同)。由此引入的应用场景是:多人开发的便捷、配置位置更加松散……

 

        严格来说(或者也是很明显的),由于当前解决的是“启动运行时”,因此本文介绍的方案属于半运行时状态,与一开始的windows桌面应用的运行时的即时加载还是有区别的(即时加载ms也有很多实现了,框架也提供了运行时创建bean的能力)。

        另外,很多同学早已转战使用spring boot了,在spring boot里,使用对应的技术点,也可以实现本文的“启动运行时”选择性加载组件(我其实也已经实现了相关的功能,但关于相关文档的说明仍在拖拉中……)

        结束冗长的背景回忆、适用场景以及简短的目标,我们来开始工程的实现相关。

1、环境

jdk:1.7

开发环境:idea 2016.3.4

spring版本:4.3.14.RELEASE

maven:3.3+

 

2、主要技术点

这是一个maven项目。

2.0 pom.xml的配置。分为两个部分:

一是关于<profiles>节,我们需要根据项目情况创建若干个<profile>,每个<profile>内,我们需要在<properties>节内定义一个属性(比如mvn.profiles.active),这个属性的值与当前<profile>的<id>一般是相同的(也可以不同),用来替换后续在工程src/main/resources/application-***.properties文件名中的“***”区域,这主要是为了在使用打包命令mvn package -P<profile.id>时,结合之后pom.xml中<resources>段中的设置,进行资源文件的精准化打包;

二是关于<build>/<resources>节,我们主要是实现资源的精准化打包。结合上面对<profile>的配置来完成,具体在后面的工程中可查看。

2.1 从org.springframework.web.context.ContextLoaderListener类派生一个CustomContextLoaderListenerod类,主要进行定制化实现:完成对某个profile约定的诸多properties文件中环境变量的先加载(重载customizeContext方法)。这里,先创建这些环境变量的原因是为后续在@Conditional注解需要的Conditional派生类中可以使用。

CustomContextLoaderListenerod类中加载的properties文件,必需有一个约定好名称的环境变量(比如本文示例工程中的PROP_ZBASE_MAIN_CONFIG_ROOT),来表示外部配置文件组的根路径。

*外部配置文件组:指对某个<profile>来说,根据业务需要,你总是要有一堆配置存在某个地方,这个文件组就是专门存这里配置的,对本项目来说,虽然是文件组,但它仍然可能是存在数据库或者远端某个服务器上。

2.2 web.xml中添加2.1中定制的<listener>;

2.3 application.properties文件。在resources目录下,创建一个默认的applications.properties属性文件,此文件其实跟本文的主题没什么关系,总之,你可以设置一些与<profile>无关的属性放在它里面;

2.4 application-**.properties文件。这些文件是必需的,且与<profile>应该是对应的。因为PROP_ZBASE_MAIN_CONFIG_ROOT代表的环境变量,应该在每个application-**.properties文件里都设置一个,用来表示外部配置文件组的根路径。

2.5 外部配置文件中的bean创建开关。其实是.properties文件中的一个键值对,正常来说,你需要在每个<profile>对的配置文件组里都有这么一个创建开关(当然值可以不同,键肯定是要相同的)

2.6 根据项目需要,实现一个或者若干个org.springframework.context.annotation.Condition接口(比如PropConfigurationCondition类实现了此接口)。接口的matches方法最简单的形式是判断上面2.5步中的键值对中的值,以返回true或者false;

2.7 在一个bean创建类(比如PropConfiguration类)上,使用@Configuration注解的同时,也使用@Conditional注解,后者的value设置为2.5步中的PropConfigurationCondition类;

 

至此,关于根据不同<profile>的配置,选择性的创建bean的步骤就介绍完了。

下面是验证步骤的要点:

2.8 创建一个Controller,在其中创建一个成员变量,使用@Autowired标识此成员变量由spring 进行注入,然而,此处你需要注意注解@Autowired的required需要设置为false。

 

3、maven工程的主要实现

这一节里,就是主要实现的各种贴贴贴,你完全可以绕过本节到最后的下载链接里,直接下载工程。

3.1 在idea中,新建一个maven工程:

        我们这里把工程的groupid设为com.bn.zbase,artifactid设为zbase-test-web。

        使用上面archetype生成的工程里,为我们生成了一个默认的老旧的工程结构(应该是还有别的archetype可以达到主动设置此效果了,然后我已经等不及了)。这里,我直接贴出改造后的目录结构:

3.2 pom.xml的修改

本文配套的项目仅是一个演示,因此仅包含了基本的依赖,以下给出与2.0节对应的配置,其余的可下载工程后查看

<profiles>
    <profile>
      <id>dev</id>
      <properties>
        <mvn.profiles.active>dev</mvn.profiles.active>
      </properties>
    </profile>
    <profile>
      <id>sit</id>
      <properties>
        <mvn.profiles.active>sit</mvn.profiles.active>
      </properties>
    </profile>
  </profiles>
  <build>
    <finalName>zbase-test-web</finalName>
    <plugins>
      <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <failOnMissingWebXml>false</failOnMissingWebXml>
        </configuration>
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.3</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>
    </plugins>
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <excludes>
          <exclude>application*.properties</exclude>
        </excludes>
      </resource>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
        <includes>
          <include>application.properties</include>
          <include>application-${mvn.profiles.active}.properties</include>
        </includes>
      </resource>
    </resources>
  </build>

3.3 CustomContextLoaderListener类的实现

主要是重载了ContextLoader类的customizeContext方法,以使用本地方法先加载必备的属性到context的环境变量对象中:

public class CustomContextLoaderListener extends ContextLoaderListener {

    private static final String PROP_ZBASE_MAIN_CONFIG_ROOT = "zbase.main.config.root";

    @Override
    protected void customizeContext(ServletContext sc, ConfigurableWebApplicationContext wac) {
        // 加载classpath下的配置
        String strConfigApplication = "classpath:application*.properties";
        loadCustomConfigFile(wac, strConfigApplication);

        String strZbaseMainConfigRoot = wac.getEnvironment().getProperty(PROP_ZBASE_MAIN_CONFIG_ROOT);
        if (strZbaseMainConfigRoot.endsWith("/")) {
            strZbaseMainConfigRoot = strZbaseMainConfigRoot.substring(0, strZbaseMainConfigRoot.length() - 1);
        }
        // 以下分开读取的原因是:当使用“http://***/*.properties”来获取远程的配置文件时,你需要指定具的文件名,
        // 而不能由*.properties来读取所有的文件
        // 关于如何实现*.properties文件组,而不是使用下面的示例,其实也可以通过多加一个间接层来实现
        String strConfig = strZbaseMainConfigRoot + "/app.properties";
        loadCustomConfigFile(wac, strConfig);
        strConfig = strZbaseMainConfigRoot + "/app2.properties";
        loadCustomConfigFile(wac, strConfig);
        strConfig = strZbaseMainConfigRoot + "/biz.properties";
        loadCustomConfigFile(wac, strConfig);

        super.customizeContext(sc, wac);
    }

    /**
     * 加载配置文件
     * @param wac
     * @param strConfigFilePath
     */
    private void loadCustomConfigFile(ConfigurableWebApplicationContext wac, String strConfigFilePath) {

        List<Resource> listResources = new ArrayList<Resource>();
        ResourcePatternResolver objResolver = new PathMatchingResourcePatternResolver();
        try {
            listResources.addAll(Arrays.asList(objResolver.getResources(strConfigFilePath)));

        } catch (IOException e) {
            e.printStackTrace();
        }
        Resource[] locations = new Resource[listResources.size()];
        locations = listResources.toArray(locations);
        for (Resource item : locations) {
            ResourcePropertySource objRes = null;
            try {
                objRes = new ResourcePropertySource(item.getFilename(), item);
                wac.getEnvironment().getPropertySources().addLast(objRes);
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

3.4 web.xml中的配置

添加一个<listener>节:

    <listener>
        <listener-class>com.bn.zbase.listener.CustomContextLoaderListener</listener-class>
    </listener>

3.5 resources目录下的属性文件添加

在resources目录下,为了演示,添加了三个资源文件:

与<profile>无关的application.properties:

# 当前使用的maven profile
# 当你在控制台使用命令:mvn clean package -DskipTests -P***
# ***代表此处的值(不太准确,这是因为此处的mvn.profiles.active与pom.xml中的<profiles>|<profile>的<id>设
# 为相同的值
zbase.profiles.active=${mvn.profiles.active}

<profile>为dev时的资源:application-dev.properties:

# 远程服务器上的配置文件根目录
# zbase.main.config.root=http://127.0.0.1:8070/dev
zbase.main.config.root=file:/${project.basedir}/conf/dev

<profile>为sit时的资源:application-sit.properties:

zbase.main.config.root=file:/e:/proj/java/zbase-test-web/conf/sit

需要注意的是:application-dev.properties与application-sit.properties文件中属性集应该是相同的。

 

3.6 自定义的外部配置文件组

如目录结构图中的conf文件夹,里面包含了dev跟sit两个子文件夹,这里以dev/biz.properties文件为例(bean创建开关的属性文件):

# PropConfigurationCondition类中使用本属性,用以判断是否创建bean
propconfig.enabled=true

3.7 实现Condition接口的条件类

/**
 * Created by zcn on 2018/2/11.
 * PropConfiguration类由spring生成bean的条件
 */
public class PropConfigurationCondition implements Condition {

    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return conditionContext.getEnvironment().getProperty("propconfig.enabled").equalsIgnoreCase("true");
    }
}

3.8 bean配置类

@Configuration
@Conditional(PropConfigurationCondition.class)
public class PropConfiguration {

    @Value("${propconfig.enabled}")
    private String _strConfigRoot;

    @Value("${zbase.config.app.val01}")
    private String _strAppVal01;

    @Value("${zbase.profiles.active}")
    private String _strProfilesActive;

    @Bean("bizParasConfig")
    public BizParasConfig appConfig() {
        BizParasConfig objBean = new BizParasConfig();
        objBean.setMainConfigRoot(_strConfigRoot);
        return objBean;
    }

}

至此,主要的代码段就结束,关于测试,就是如下的片段了:

@Controller
public class MainController {
    private static final Logger logger = LoggerFactory.getLogger(MainController.class);
    private static final String MAIN_CONFIG_ROOT = "mainConfigRoot";

    @Autowired(required = false)
    @Qualifier("bizParasConfig")
    private BizParasConfig bizParasConfig;

    @RequestMapping(value = {"/", "/index"})
    public String index(Model model) {
        String strVal = "nothing";
        if (bizParasConfig != null) {
            strVal = bizParasConfig.getMainConfigRoot();
        }

        model.addAttribute(MAIN_CONFIG_ROOT, strVal);
        logger.info(strVal);
        return "index";
    }
}

 

注意上面的@Autowired的required属性为false。

 

最后,是本文示例的下载链接:

https://github.com/basenumber/zbase-test-web.git

 

Spring AOT编译与GraalVM原生镜像:Java应用启动性能优化实战 即时编译(JIT)作为Java性能优化的核心机制,通过在运行时将字节码动态编译为本地机器码,实现了长期运行服务的高峰值性能。然而,其解释执行与动态优化模式也带来了显著的启动预热成本,这在云原生时代对快速启动和弹性伸缩提出了挑战。提前编译(AOT)技术通过将大量运行时工作前移至编译期,结合静态分析与字节码生成,为Java应用带来了启动速度和内存占用的革命性提升。Spring 6与Spring Boot 3将AOT支持提升到新高度,通过Bean定义推断、反射元数据收集等静态分析,生成高度优化的预编译蓝图。结合G 阅读详情

相关推荐

Vienna整流器双PI闭环仿真:从SVPWM调制到中点电位平衡的实践解析

本文深入解析Vienna整流器双PI闭环仿真技术,涵盖SVPWM调制和中点电位平衡的实践细节。通过详细的MATLAB/Simulink仿真搭建流程和常见问题排查方法,帮助工程师掌握高效整流器控制策略,提升系统稳定性和动态响应性能。

weixin_29168153的博客 326

spring自动装配详解

@AutoWired的使用 @AutoWired的使用 //一个Dao @Repository public class UserDao { } @Service public class UserService { @Autowired private UserDao userDao; } 结论: a:自动装配首先时按照类型进行装配,若在IOC容器中发现了多个相同类型的组件,那么就按照 属性名称来进行装配 @Autowired private UserDao userDao; 比如,

半夏_2021的博客 374

锐捷路由器DNS Proxy保姆级配置教程:从零到实战,手把手教你搞定内网域名解析

本文提供锐捷路由器DNS Proxy功能的详细配置教程,从基础环境搭建到实战测试,手把手教你实现内网域名解析。涵盖上游DNS设置、内网域名映射、故障排查等关键步骤,帮助网络管理员快速解决内网访问难题,提升工作效率。

weixin_29284657的博客 554

SpringBoot @Profile注解 实现配置文件控制bean的加载

通过设置spring.profiles.active配置,来实现不同情况下选择实例化不同的Bean 根据spring.profiles.active的值来决定加载哪个bean @Configuration public class Config { @Bean @Profile("dev") public User u1() { System.out.println("1111"); return new User("dev"); }

这就是快乐嘛 553

基于STM32的智能循迹小车设计(基础版)

基于STM32的智能循迹小车设计 硬件准备 1、小车底盘+四直流电机(带轮) 2、STM32F103C8T6核心板 3、12V 8700mAh锂电池(可以用几节18650锂电池) 4、循迹模块 选择的是TCRT500L,五路集成在一起,集成度比较高,但是可能不如五个单独的循迹模块好用 5、L298N电机驱动模块 四驱车为啥用L298N电机驱动模块? 可以把左边的两个电机并联,用输出A控制。把右边的两个电机并联,用输出B控制。 12V供电接电源正极,供电GND接电源负极和核心板GND,5V供电接核心

Rendezvous1的博客 3万+

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 392

spring.profiles.active配置多种spring启动环境

我们在开发的时候,经常会需要多种环境,比如开发环境,测试环境,生产环境的数据库地址是不一样的。spring mvc环境下如何配置呢?             在web.xml里面有个属性,可以配置。             比如我们配置测试环境。              spring.profiles.active test            

飞在江湖的专栏 1万+

科研党福音:如何用Zotero+Paper Agent打造你的AI论文速递系统(附详细配置教程)

本文为科研工作者提供了一套利用Zotero和开源工具Paper Agent构建自动化AI论文速递系统的详细教程。该系统能基于用户在Zotero中的文献库智能学习研究兴趣,每日自动从arXiv等平台筛选、下载并深度解读最相关的前沿论文,生成个性化日报,实现从被动接收到主动精准获取的知识工作流重塑。

kite3的博客 514

web项目根据profiles动态配置各环境的properties和logback.xml

前情提要:web项目中的配置文件一般有开发环境dev,测试环境test,生产环境prd的区分,每次本地运行测试或者打包都需要手动修改web.xml或者spring.xml(因为一般各个环境的配置文件都是在这2个XML中配置加载的),很麻烦还容易忘。最近突然发现我们公司其他项目组有在maven中配置profiles,可以通过在maven插件上点击选择,直接就能打包运行所选的环境。如图 1: 研究了一波,我这边将不通环境的logback配置文件也集成到里面了,需要实现的目标是:在idea的maven插件这

糯米爱吃西瓜 1036

RH850从0搭建Autosar开发环境【1】- 如何创建Davinci Configurator配置工程

当我们在公司接触Autosar开发环境时,基本都是完整的Davinci Configurator的配置工程,我们只能修修补补。 从本章开始将手把手搭建Rh850基于Vector公司Davinci Configurator的autosar配置工程。主要涉及到OS,COM,DCMM,NVM,BSWM,ECUM等基本模块,包括Vlink,memap使用,XCP标定的实现等。基本是实现一个基础版的项目开发。包括后期的GreenHills编译问题处理,生成最终的Hex文件。

weixin_42412049的博客 1万+

网工运维掌握OpenClaw这7大必备技能,自动化运维效率直接起飞

OpenClaw的核心就是它的技能系统。通过官方技能市场(clawhub.ai),你只需一条命令就能安装扩展,让AI代理变成你的“运维副手”。今天我就结合网工运维的真实痛点,精选7项最热门、最实用的OpenClaw技能(基于ClawHub下载量和实际测试),手把手教你安装、使用和进阶玩法。这些技能不是玩具,而是能直接提升运维效率10倍以上的生产力工具!安装后,你的OpenClaw代理就能自动处理Zabbix告警、总结syslog日志、更新Obsidian网络拓扑笔记、甚至通过n8n触发自动修复脚本。

网络技术联盟站 573

spring的Profile使用对比和应用场景分析

spring中存在这样一个功能,通过Profile来选择不同环境下的不同配置,说白了,就是通过设置一个参数来选择使用不同的数据,这个数据可能是一个bean,可能是一个xml文件,也有可能是一个propertes文件。经过代码演练和测试,我大体知道了这个功能是干嘛的,也初步知道了它的几种实现方式,但是实际上我依然不是十分明白它的优势和好处在何处,因为根据自己以往的项目经验来说,我觉得用这种方式似乎还有

程序员涂小哥的技术博客 4199

使用 MATLAB/Simulink + Simscape Electrical,构建一个含光伏并网系统与SVG的联合仿真模型,实现动态无功补偿与电压支撑

摘要:本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合系统建模方法。通过构建包含光伏单元、SVG主电路和控制模块的仿真模型,实现动态无功补偿与电压稳定。重点阐述了ip-iq无功检测算法、双闭环控制和SVPWM调制等关键技术。仿真结果表明,该系统能快速响应无功需求,在10ms内将功率因数提升至0.98以上,有效抑制电压波动。文章为新能源并网系统中的电能质量治理提供了实用解决方案,并提出了进一步优化方向。

xiaoheshang_123的博客 322

spring profile 与maven profile

profile: n. 侧面,半面; 外形,轮廓; [航]翼型; 人物简介; vt. 描…的轮廓; 给…画侧面图; 为(某人)写传略; [机]铣出…的轮廓; 这个词具体是什么意思,参考:https://www.zhihu.com/question/28464897 我的理解,就是一个...

chenxiang0250的博客 509

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

@Profile 根据不同环境注入bean

介绍 @Profile元注解是在不同的生产环境中,@Bean创建的SpringBean根据spring.profiles.active指定的环境不同创建不同环境的bean对象 一.@Profile元注解需要配合spring.profiles.active一起使用 二.首先在resources下创建三个配置文件 image.png application.properties: ...

架构师与哈苏 1059

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Spring Boot实战(二)Spring常用配置 2.4 Profile

2.4.1点睛 Profile为在不同环境下使用不同的配置提供了支持(开发环境下的配置和生产环境下的配置肯定是不同的,例如,数据库的配置)。 (1)通过设定Environment的 ActiveProfiles来设定当前context需要使用的配置环境。在开发中使用@Profile注解类或者方法,达到在不同情况下选择实例化不同的Bean。 (2)通过设定jvm的spring.profiles.ac...

qq_40929047的博客 2801

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

2022-01-25 Spring控制是否初始化Bean

文章目录背景实现方式Profile设置Profile的方式源码分析@Condition解析 背景 本次因为业务要求需要集成外部jar,但是该jdk版本是1.8,我们的服务是当前使用区域支持1.8但是其他其余部分不支持,但是也不需要该服务。因此需要项目差异化实例化需要调用的服务 实现方式 引入第三方jar,并且设置访问provided scope的其他参数如下: compile 默认的scope,表示 dependency 都可以在生命周期中使用。而且,这些dependencies 会传递到依赖的项目中。适

旅程的点点滴滴 845

【手撕 Spring】 条件化的 bean

Spring条件化的bean是根据不同的条件在应用程序中选择性地创建和配置的bean。条件化的bean可以根据环境变量、系统属性、配置文件中的属性或其他条件进行配置。通过使用Spring的条件化注解和配置,可以根据不同的条件选择性地创建和配置bean,以满足特定的需求。条件化的bean可以在不同的环境中使用不同的配置,从而实现灵活的应用程序配置。

激流丶的博客 7139

chapter03_高级装配_2_Profile与条件化Bean

开发和部署可能会使用不同的数据库,Profile就在解决这个问题 通过配置 profile bean,Spring可以在运行时确定使用哪个bean Java Config配置 @Profile("xxx") 示例 @Configuration public class DataSourceConfig { @Bean @Profile...

captxb的博客 93

spring3使用profile

在spring3与web.xml的环境中使用spring的profile spring-ftp-file-service.xml &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http:...

conkeyn的专栏 544

Apereo CAS 配置管理完全指南:外部化配置、Spring Cloud Config Server 与热重载实战

CAS(Central Authentication Service)是 Apereo 基金会出品的开源企业级单点登录(SSO)与身份认证平台。其配置管理的核心设计目标是:让部署者**只关心自己业务所需的配置项**,其余全部交给 CAS 内建的默认配置与自动装配机制处理。本文将基于 [Configuration-Management.md](https://link.gitcode.com/i/1

gitblog_00579的博客 1101

生产环境屏蔽swagger(动态组装bean)

spring动态组装bean 背景介绍: 整合swagger时需要在生产环境中屏蔽掉swagger的地址,不能在生产环境使用 解决方案 使用动态profile在生产环境中不注入swagger的bean swagger配置 profile="dev" <beans profile="dev"> <bean class="s...

weixin_30341745的博客 469

spring

在应用开发中用的非常多, @Component注解是一个通用注解,可以用在于任何类上。包括普通java类,业务逻辑组件,持久化对象等等。通过@Component注解spring自动创建该类的实例注入SpringIOC容器中。@Bean是用于配置类中声明一个Bean的,它通常是用于配置类的方法上面,表示把这个方法的返回对象注册到Spring IOC容器中。通过@Bean自定义Bean的创建和初始化过程,包括指定Bean的名称、作用域、依赖关系等。1.用途不同@Component用于标识普通的类。

黑冰[̲̅V̲̅I̲̅P̅] 818

Spring @Profile注解

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33753003的博客 118

spring注解之@profile

spring中@profile与maven中的profile很相似,通过配置来改变参数。 例如在开发环境与生产环境使用不同的参数,可以配置两套配置文件,通过@profile来激活需要的环境,但维护两套配置文件不如maven中维护一套配置文件,在pom中通过profile来修改配置文件的参数来的实惠。 也有例外,比如我在开发中调用商城接口经常不能返回我需要的数据,每次都需要mock数

程序猿开发日志【学习永无止境】 1万+

聚焦IOC容器刷新环节postProcessBeanFactory(BeanFactory后置处理)专项

在很早之前我们单独写过一篇文章《分析SpringBoot启动配置原理》,具体可见:解析SpringBoot启动配置原理其中IOC容器的刷新环节可当重点分析,值得在读源码时进行深入分析,我们会从多个方向上再次进行分析回顾和学习。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+
上一篇: 扩展fastjson的SimplePropertyPreFilter,以过滤不需要序列化的属性
下一篇: [昨日实践]springboot1.5.x中引用thymeleaf3.0版本的一种简单实现
smartcore
博客等级 码龄19年 30粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值