SpringBoot 热加载以及添加debug调试

本文介绍如何使用Spring Loaded实现Spring Boot项目的热部署,包括配置Maven插件、启动项目及调试方法。

Springboot有两种热加载的方式,一种是spring-boot-devtools,但个人感觉这种方式效果太差,所以这里就不介绍了。

另外一种是springloaded,这个要搭配Maven来使用,所以要先装好Maven。

我用的开发工具是IDEA。

在pom.xml文件中的build标签中加入以下代码中的红色部分

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<configuration>
			</configuration>
			<dependencies>
				<dependency>
					<groupId>org.springframework</groupId>
					<artifactId>springloaded</artifactId>
					<version>1.2.6.RELEASE</version>
				</dependency>
			</dependencies>
		</plugin>
	</plugins>
</build>


其他的什么都不用干,接下来就可以在控制台的命令行中在项目文件夹下通过mvn sprint-boot:run的方式执行并启动




如果感到麻烦的话在maven的工具栏里也有按钮,双击执行就行


这种方式只能进行普通运行,无法进行调试操作,如果想要使用debug方式,需要继续在pom.xml文件中加入些代码:

<build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <jvmArguments>
        -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
          </jvmArguments>
        </configuration>
        <dependencies>
          <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
            <version>1.2.6.RELEASE</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
</build>


要注意,加入这段代码之后,只能用debug的方式进行执行

接下来在工具栏中的Run -> Edit Configurations... -> Remote

新建一个启动项,什么都不用改,但为了方便名字随便起一个你能区分开的就行,

我这里叫debug了


直接点OK,接下来执行mvn spring-boot:run的方法

当启动一会后控制台会卡在:

Listening for transport dt_socket at address: 5005


这个时候在启动项中找到刚刚加入的那个remote,点击debug方式启动


然后大功告成,一切和正常启动一样,添加断点,进入代码





<think>我们正在讨论SpringBoot中基于条件加载properties文件或属性。根据用户的问题,他希望在满足特定条件时才加载某个配置文件或属性。SpringBoot提供了多种条件化配置的方式,例如使用`@Conditional`系列注解。参考引用[4]中提到,我们可以通过自动配置(xxxAutoConfiguration)来有条件地注册bean。同样,这个思路也可以用于条件化加载属性文件。在Spring Boot中,条件化加载属性文件可以通过以下几种方式实现:1.使用`@ConditionalOnProperty`注解:根据环境中是否存在某个属性或属性的值来决定是否加载配置。2.使用`@ConditionalOnClass`或`@ConditionalOnMissingClass`:根据类路径下是否存在某个类来决定。3.使用`@ConditionalOnBean`或`@ConditionalOnMissingBean`:根据Spring容器中是否存在某个Bean来决定。4.使用`@ConditionalOnExpression`:通过SpEL表达式进行更复杂的条件判断。5.使用`@Profile`:根据激活的profile来加载不同的配置。另外,我们还可以通过自定义条件注解(实现`Condition`接口)来实现更复杂的条件逻辑。对于属性文件的加载,通常有两种方式:-使用`@PropertySource`注解加载指定的属性文件。-使用`@ConfigurationProperties`绑定属性到Bean。我们可以将条件注解与这些方式结合使用。下面分别给出示例:**示例1:使用`@ConditionalOnProperty`和`@PropertySource`**假设我们有一个属性文件`conditional.properties`,我们希望在某个特定的属性(例如`load.conditional.properties`)被设置为`true`时才加载这个文件。首先,创建一个配置类,使用`@PropertySource`并配合`@ConditionalOnProperty`: ```java@Configuration@ConditionalOnProperty(name ="load.conditional.properties",havingValue= "true")@PropertySource("classpath:conditional.properties")public classConditionalPropertiesConfig {//这个配置类只有在属性load.conditional.properties为true时才会被加载,从而加载conditional.properties文件}``` **示例2:使用`@Conditional`自定义条件**我们可以实现Spring的`Condition`接口,自定义条件判断逻辑。例如,自定义一个条件`CustomCondition`: ```javapublic classCustomConditionimplements Condition{@Overridepublic booleanmatches(ConditionContext context, AnnotatedTypeMetadatametadata){//这里写条件判断逻辑,比如从环境变量中获取某个属性,判断是否符合条件String property= context.getEnvironment().getProperty("custom.condition.property");return "enable".equals(property);} }```然后在配置类上使用:```java@Configuration@Conditional(CustomCondition.class)@PropertySource("classpath:custom.properties")public classCustomPropertiesConfig {}``` **示例3:使用`@Profile`**如果我们希望在不同的profile下加载不同的属性文件,可以使用`@Profile`。```java@Configuration@Profile("prod") @PropertySource("classpath:prod.properties") publicclass ProdPropertiesConfig{ }@Configuration@Profile("dev")@PropertySource("classpath:dev.properties")public classDevPropertiesConfig {} ```这样,当激活`prod`profile时,会加载`prod.properties`;激活`dev`profile时,会加载`dev.properties`。**示例4:条件化绑定`@ConfigurationProperties`**我们也可以将条件注解用于`@ConfigurationProperties`,使得只有在条件满足时才创建配置属性Bean。 ```java@Configuration@ConfigurationProperties(prefix ="myapp")@ConditionalOnProperty(prefix ="myapp",name ="enabled",havingValue= "true",matchIfMissing =false)public classMyAppProperties {//属性绑定}```这样,只有当`myapp.enabled`为`true`时,才会创建`MyAppProperties`这个Bean。另外,如果希望条件化地加载整个配置类(包括其中的`@Bean`方法和属性绑定),也可以将条件注解放在配置类上。**注意**:使用`@PropertySource`加载的properties文件,Spring Boot默认只支持`properties`文件,不支持`yaml`文件。如果需要加载yaml文件,需要自定义一个`PropertySourceFactory`,使用`YamlPropertySourceLoader`来加载。总结:SpringBoot提供了灵活的条件化配置机制,我们可以根据不同的条件(属性、类是否存在、Bean是否存在、Profile等)来决定是否加载某个属性文件或配置属性类。根据用户的问题,他可能希望的是在满足特定条件时加载一个外部的properties文件,那么上述示例1和示例2可能是最接近的。如果用户希望的是在自动配置中条件化加载属性,那么可以结合自动配置类(通过`spring.factories`注册)和条件注解来实现,如引用[4]所述。下面是一个自动配置中条件化加载属性的示例:在`src/main/resources/META-INF/spring.factories`中指定自动配置类: ```propertiesorg.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.ConditionalPropertiesAutoConfiguration```然后定义自动配置类:```java@Configuration@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)//根据需要指定顺序@ConditionalOnProperty(name= "load.conditional.properties", havingValue ="true") @PropertySource("classpath:conditional.properties") publicclass ConditionalPropertiesAutoConfiguration {//可以在这里定义需要条件化初始化的Bean,或者仅仅加载属性文件}```这样,当应用启动且`load.conditional.properties`属性为`true`时,就会加载`conditional.properties`文件。最后,需要注意的是,如果属性文件中的属性需要被绑定到`@ConfigurationProperties`Bean,那么确保该Bean在条件满足时被创建即可。希望这些方法能够帮助用户实现基于条件加载属性文件的需求。</think>在 Spring Boot 中实现基于条件加载 properties 文件或属性,可通过以下方法实现: ### 一、核心实现方案 #### 1. 使用 `@Conditional` 系列注解(推荐) 通过条件注解控制配置类的加载,间接管理属性文件加载: ```java @Configuration @ConditionalOnProperty(prefix = "myapp", name = "enable-module", havingValue = "true") @PropertySource("classpath:module.properties") public class ModulePropertiesConfig { // 配置类仅在满足条件时加载 } ``` **原理**: - `@ConditionalOnProperty` 检查 `application.properties` 中是否存在 `myapp.enable-module=true` - 条件满足时加载 `module.properties` 文件 - 支持其他条件注解如: - `@ConditionalOnClass`:类路径存在时加载 - `@ConditionalOnExpression`:SpEL 表达式控制 - `@ConditionalOnCloudPlatform`:云平台环境控制 #### 2. 自定义 `PropertySource` 实现 编程式控制属性加载: ```java public class ConditionalPropertySource implements PropertySourceFactory { @Override public PropertySource<?> createPropertySource(String name, EncodedResource resource) { if (shouldLoad(resource)) { // 自定义条件判断 return new ResourcePropertySource(resource); } return new EmptyPropertySource(); // 返回空属性源 } private boolean shouldLoad(EncodedResource resource) { // 实现自定义条件逻辑(如环境变量、系统属性等) return System.getenv("LOAD_EXTRA_PROPS") != null; } } // 使用示例 @Configuration @PropertySource( value = "classpath:conditional.properties", factory = ConditionalPropertySource.class ) public class AppConfig {} ``` #### 3. Profile 控制 通过 Spring Profile 实现环境隔离: ```properties # application-dev.properties module.enabled=true extra.config=dev_value # application-prod.properties module.enabled=false ``` 加载时激活指定 Profile: ```bash java -jar app.jar --spring.profiles.active=dev ``` ### 二、属性绑定与条件验证 #### 1. 条件化绑定配置属性 ```java @ConfigurationProperties(prefix = "module") @Validated @ConditionalOnProperty(name = "module.enabled", matchIfMissing = false) public class ModuleProperties { @NotBlank private String configKey; // Getter/Setter } ``` #### 2. 多文件组合加载 使用 `@PropertySources` 组合多个条件化属性源: ```java @Configuration @PropertySources({ @PropertySource( value = "classpath:primary.properties", condition = @ConditionalOnProperty("app.load-primary") ), @PropertySource( value = "classpath:fallback.properties", condition = @ConditionalOnExpression("!${app.load-primary:false}") ) }) public class MultiSourceConfig {} ``` ### 三、最佳实践建议 1. **优先级管理**: - 使用 `@PropertySource` 的 `order` 属性控制加载顺序 - 默认优先级:命令行参数 > `application-{profile}.properties` > 自定义属性文件 2. **自动配置集成**: - 在 starter 中通过 `spring.factories` 注册条件化配置: ```properties org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.example.ConditionalPropertiesAutoConfiguration ``` 3. **动态刷新**: - 结合 `@RefreshScope` 实现运行时属性热更新(需 Spring Cloud Config) 4. **YAML 支持**: - 自定义 `YamlPropertySourceLoader` 实现条件化 YAML 加载 ### 四、调试技巧 启用条件评估报告: ```properties # application.properties debug=true ``` 启动日志将输出: ```log CONDITIONS EVALUATION REPORT ---------------------------- Positive matches: ----------------- ModulePropertiesConfig matched: @ConditionalOnProperty (myapp.enable-module=true) matched ``` > **关键机制**:Spring Boot 的条件装配机制通过 `ConditionEvaluator` 在配置类解析阶段评估条件注解[^4],自动配置类通过 `spring.factories` 注册并由 `AutoConfigurationImportSelector` 筛选[^2],最终由 `ConfigurationClassParser` 处理属性源加载[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值