你有没有掉进去过这些Spring Boot中的“陷阱“(上)

一、Spring Boot配置文件中的“陷阱”

spring boot的配置文件是指导spring boot应用运行的重要文件,是一个全局的配置文件。与spring、spring mvc、mybatis等框架的配置文件相比,spring boot的配置文件更加简化,底层默认做了很多配置。spring boot的配置文件默认放在resources目录下,且文件名必须为application

Spring Boot存在两种形式的配置文件,分别是propertiesyml格式。在两种配置文件同时存在的情况下,properties格式的配置文件优先级更高。与之相比,yml格式配置文件更加简洁明了、紧凑且可读性高,Spring Boot支持并推荐使用yml格式配置文件。

工程搭建

新建一个Maven工程spring-boot-traps,在pom.xml文件中添加依赖以及Maven插件,完整的pom.xml文件如下:

    4.0.0            org.springframework.boot        spring-boot-starter-parent        2.6.3                com.citi    spring-boot-traps    0.0.1-SNAPSHOT    spring-traps    Demo project for Spring Boot            1.8                            org.springframework.boot            spring-boot-starter                            org.springframework.boot            spring-boot-starter-web                            org.springframework.boot            spring-boot-devtools            runtime            true                            org.projectlombok            lombok            true                            org.springframework.boot            spring-boot-starter-test            test                            org.apache.commons            commons-lang3            3.8.1                        ${artifactId}                                    org.springframework.boot                spring-boot-maven-plugin                                                                                        org.projectlombok                            lombok                                                                                    

com.citi.spring.traps包下新增主启动类TrapsApplication

@SpringBootApplicationpublic class TrapsApplication {    public static void main(String[] args) {        SpringApplication.run(TrapsApplication.class, args);    }}

test包的相同路径下增加主启动类的测试类TrapsApplicationTest

@SpringBootTestpublic class TrapsApplicationTest {    @Test    public void context() {        ApplicationContext context = new AnnotationConfigApplicationContext("com.citi.spring.traps");        String[] beanDefinitionNames = context.getBeanDefinitionNames();        for (String beanDefinitionName : beanDefinitionNames) {            System.out.println("容器中的对象:" + beanDefinitionName);        }    }}

执行测试:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

Spring容器可以正常运行。

配置文件加载顺序的“陷阱”

使用配置文件给实体类赋值,在entity包下新增UserProperties

@Data@Component@ConfigurationProperties(prefix = "traps.user")public class UserProperties {    private String name;    private Integer age;}

@ConfigurationProperties注解可以指定配置文件中配置项的前缀。

application.yml中增加配置:

traps:  user:    name: stark    age: 41

增加UserProperties的测试类:

public class UserPropertiesTest extends TrapsApplicationTest {    @Autowired    private UserProperties userProperties;
@Testpublic void getProperty() {    System.out.println(userProperties);}

}

执行测试:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台打印日志,可以看出UserProperties被成功赋值。

配置文件优先级

工程目录下的配置文件优先级如下:

工程目录下/config/application.yml,优先级最高工程目录下/application.yml,优先级第二resources/config/application.yml,优先级第三resources/application.yml,优先级第四

不同位置都放置了配置文件,高优先级的配置会覆盖低优先级的配置,多个配置文件是互补的,即取多个文件的并集。

验证配置文件优先级:

resource目录下新建config文件夹,增加application.yml

traps:user:name: stark in resources/config/age: 41

执行测试:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台打印出的日志,可以确定resources目录下的application.ymlconfig目录下的application.yml覆盖了。

在工程根目录下新增application.yml

traps:user:name: stark in root/age: 41

执行测试:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台日志打印,可以确定工程根目录下的配置文件覆盖了resource目录下的两个配置文件。

在工程根目录下新建config目录,在config目录下新增application.yml

有道小P 有道小P

有道小P,新一代AI全科学习助手,在学习中遇到任何问题都可以问我。

有道小P 64 查看详情 有道小P

traps:user:name: stark in root/config/age: 41

执行测试:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台日志打印,可以确定工程根目录下config文件下的配置文件的优先级是最高的。

application.yml多环境配置

第一种方式可以使用spring.profile.active指定配置文件。

resources目录下新建两个配置文件application-dev.ymlapplication-test.yml

traps:user:name: stark in devage: 41
traps:user:name: stark in testage: 41

修改application.yml,使用spring.profile.active指定使用的配置文件:

spring:profiles:

指定使用的配置文件

active: test

删除config目录,执行测试:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台的日志可以确定,使用的配置文件为test环境的配置文件。

第二种方式是使用占位符,即启动应用时指定使用哪个环境的配置。修改application.yml

spring:

profiles:

使用占位符

active: ${spring.profiles.active}

使用Maven命令打包,在终端中执行启动命令并指定配置文件:

java -jar spring-boot-traps.jar --spring.profiles.active=test

终端启动日志如下:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

控制台日志显示使用的配置文件是test

定时任务执行的“陷阱”

Spring Boot中可以非常简单的实现定时任务,而且定时任务有自己独立的线程池,不会影响到业务主线程。

Spring Boot中编写定时任务需要用到两个注解:

  • @EnableScheduling标注在配置类上使@Scheduled注解生效
  • @Scheduled注解标注在方法上,表示这是一个定时任务

@Scheduled注解的参数包括:

  • fixedDelay:上次任务的结束和下次任务的开始之间的固定间隔多少秒
  • fixedRate:上次任务的开始和下次任务开始之间的频率,不管任务是否结束
  • initialDelay:与fixedDelayfixedRate组合使用,指的是第一次任务等待指定的时间后才开始执行
  • cron:表达式配置任务执行时间

编写定时任务类:

新建task目录,新增ScheduledTask类,定义定时任务:

@Component

@Slf4jpublic class ScheduledTask {@Scheduled(fixedRate = 1000)public void task01() throws InterruptedException {log.info("Scheduled task01 processing");while (true) {Thread.sleep(2000);log.info("Scheduled Task process something");}}

@Scheduled(fixedRate = 1000)public void task02() throws InterruptedException {    log.info("Scheduled task02 processing");}

}

在主启动类上增加注解@EnableScheduling,表示启用定时任务。

启动主程序类,观察控制台打印的日志:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据打印的日志可以发现,只有task01在运行,task02并没有运行,这是为什么

点击主启动类上的@EnableScheduling注解,查看ScheduledAnnotationBeanPostProcessor类的源码:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

其中setScheduler方法的作用就是设置定时任务线程池,而Spring Boot默认使用单线程去执行定时任务,线程一直在task01while中循环,没有多余的线程去执行task02

配置定时任务线程池

配置定时任务线程池的方式有两种,第一种是在application.yml中配置线程池:

application.yml中增加定时任务线程池配置:

spring:profiles:

指定使用的配置文件

active: test

task:scheduling:pool:size: 5

重新启动应用:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台的打印可以看出,task01task02都执行了。

第二种方式是通过编写配置类ScheduleConfig实现自定义定时任务的线程池:

新增config包,在config包下新增配置类ScheduleConfig

@Configurationpublic class ScheduleConfig {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(5);return taskScheduler;}}

注释掉application.yml中的线程池大小配置,重新启动应用:

你有没有掉进去过这些Spring Boot中的“陷阱“(上)

根据控制台日志显示,task01task02都可以正常执行。

以上就是你有没有掉进去过这些Spring Boot中的“陷阱“(上)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/461910.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 03:50:37
下一篇 2025年11月8日 03:52:50

相关推荐

  • Internet Computer (ICP)币运作机制_2025-2030年市场前景

    ICP通过去中心化网络节点构建链上计算架构,子网以阈值中继技术实现共识与通信;代币经济中ICP转为cycles消耗形成通缩,NNS调节价格稳定资源成本;开发者用Motoko编写合约并经dfx部署至子网,应用全栈运行于链上,用户通过域名直接交互。 一、理解ICP的链上计算架构 Internet Com…

    2025年12月11日
    000
  • 为什么你的止损总被打掉?如何避开大众设置止损的密集区

    止损频繁触发因设于关键位易被猎取,应避开支撑阻力密集区,结合ATR波动率动态调整止损,初始硬止损后盈利达1R即切换为移动止损,提升容错并锁定利润。 binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册入口: APP下载: 止损频繁被触发,…

    2025年12月11日
    000
  • 详解Blast的“原生收益”模型及其争议

    Blast的“原生收益”模型通过将用户存入的ETH质押为stETH、稳定币存入Maker DSR自动获取收益,收益由协议层集成并返还。1、用户通过官方桥接转入资产,智能合约自动转换为stETH或存入DSR;2、依赖Lido与MakerDAO带来系统性风险,若其出现安全或利率问题将直接影响收益;3、初…

    2025年12月11日
    000
  • 为什么说“Not your keys, not your coins”?理解资产自托管的重要性

    掌握私钥是拥有数字资产的前提,因私钥可证明所有权并控制交易。1、每个地址对应唯一私钥,丢失或泄露将导致资产无法挽回。2、中心化平台代管私钥,用户实际不掌控资产。自托管钱苞让用户本地生成并保管助记词,离线存储私钥,自主完成交易签名。1、应选用硬件或非托管软件钱苞。2、助记词严禁上传云端或分享。3、所有…

    2025年12月11日
    000
  • 为什么合约新手要避开小市值山寨?控盘严重导致的定向爆破

    小市值山寨币因流动性差、持仓集中易被控盘,新手合约交易者需警惕定向爆破风险。首先应识别高风险币种,避开日均成交额低于1000万美元、订单簿深度不足、前10地址持币超50%的项目,并排除交易所评级为“高风险”的品种。其次调整交易策略,将杠杆控制在5倍以内,单笔亏损不超过账户总额的1%,并通过止损反推仓…

    2025年12月11日
    000
  • 警惕幸存者偏差:为什么你看到的成功案例可能都是陷阱

    幸存者偏差是因只关注成功而忽略失败导致的认知错误,需识别沉默数据、验证多角度信息并建立系统评估框架以避免决策失误。 在分析成功案例时,人们常忽略失败的大多数,仅凭幸存者数据做出判断,导致决策失误。 为了方便新手快速上手币圈交易并实时查看市场数据,可通过主流交易所币安(Binance)或欧易OKX注册…

    2025年12月11日
    000
  • Curve Finance的工作原理是什么?为何它被称为稳定币兑换之王

    Curve Finance通过StableSwap算法优化稳定币兑换,实现低滑点与高资本效率;算法结合恒定和与乘积模型,在小额交易时保持1:1汇率降低滑点,大额交易时自动调整维持平衡;针对稳定币锚定特性,集中流动性于价格曲线平坦区,显著压缩无常损失,使LP在低风险下持续赚取手续费;并通过CRV与ve…

    2025年12月11日
    000
  • Cookie币staking收益研究_长期持有价值分析

    COOKIE币质押需先确认账户余额并连接兼容链,通过官方页面锁定代币获取基于通胀模型的动态收益,APY随市场波动;高收益率不保证净收益,须结合币价表现计算实际回报,避免因价格下跌导致亏损;不同锁仓周期影响流动性,长期质押收益更高但牺牲资金灵活性,需权衡机会成本;生态发展决定代币价值支撑,应关注项目进…

    2025年12月11日
    000
  • Render Token (RNDR)币应用场景_未来五年价格预测报告

    Render网络通过连接全球GPU资源实现去中心化渲染,支持AI训练、元宇宙开发与影视特效制作,任务由分布式节点并行处理,结果经区块链验证后以RNDR代币结算,已成功应用于《流浪地球》等影片的高精度渲染,大幅提升效率并降低成本。 一、Render网络的去中心化渲染原理 Render网络通过连接全球闲…

    2025年12月11日
    000
  • 别再盲目跟单了,这5个数据教你独立看懂大盘!

    2025年A股将震荡上行,先扬后抑年末冲刺,受益于经济修复、政策支持及科技主线引领,全年有望突破4000点,涨幅预计20%-25%。 Binance币安 欧易OKX ️ Huobi火币️ gateio芝麻   掌握关键数据,摆脱盲目跟单,实现独立判断大盘走势。 一、观察市场成交总额 市场成交总额是衡…

    2025年12月11日
    000
  • 什么是比特币“减半”?它为什么被视为牛市启动的关键信号

    比特币减半是每四年区块奖励减半的通缩机制,2024年4月奖励降至3.125 BTC,预计2028年进一步降至1.5625 BTC,最终在2140年挖完;因供应减少、历史上涨规律及市场关注度提升,减半常被视为牛市信号。 比特币“减半”是其协议中预设的通缩机制,大约每四年将矿工获得的区块奖励减少一半。 …

    2025年12月11日
    000
  • Optimism的“超级链”(Superchain)愿景是什么?

    Optimism的“超级链”愿景通过模块化与去中心化技术构建统一生态系统。一、实现跨链无缝交互:采用标准化通信协议,部署跨链消息传递桥接合约,支持双向通信;统一地址格式映射规则,避免用户混淆;引入轻客户端验证机制,提升交易确认速度。二、共享排序器网络:多链共用去中心化排序器,节点分布于全球运营商,通…

    2025年12月11日
    000
  • Arbitrum (ARB)币项目深度研究_长期发展路线与价格展望

    Arbitrum(ARB)是以太坊Layer 2扩容方案,基于Optimistic Rollup技术提升效率与安全,采用交互式欺诈证明、Nitro升级及AnyTrust机制优化性能与去中心化;ARB代币用于DAO治理、潜在质押收益及生态燃料支付;通过Orbit框架支持定制化应用链,推动模块化L2生态…

    2025年12月11日
    000
  • 为什么需要避免频繁查看行情?克服短线交易的诱惑

    频繁查看行情易引发情绪化交易,应通过识别波动本质、建立物理隔离、重构反馈系统和强化认知训练来改善。1、忽略短期噪音,记录交易冲动并复盘偏差;2、卸载移动端软件,屏蔽网站,设定固定查看时段;3、以策略执行合规率考核交易,建立日志与惩罚机制;4、用深度研究替代盯盘,开展项目制学习积累长期价值信息。 频繁…

    2025年12月11日
    000
  • COOKIE币流通机制分析_2029-2045年市值预测

    COOKIE币总发行1亿枚,46%流通,56.9%用于生态激励,14.76%用于质押与上市,团队持股9%并设解锁机制,预种子轮占9.35%;市值受技术迭代、生态合作、质押收益、交易活跃度及社区治理影响;历史最高价$0.6697,现价约$0.0047,市场情绪中性偏贪婪,24H换手率0.11%,成交额…

    2025年12月11日
    000
  • 什么是标记价格与最新成交价?为什么K线没跌到却爆仓了

    标记价格是交易所防操纵的参考价,用于计算盈亏和强平,最新成交价是实际交易价格构成K线;当标记价格跌破强平价时即触发爆仓,即使K线显示的最新价未达止损位,主因是两者差异及高杠杆放大风险。 binance币安交易所 注册入口: APP下载: 欧易OKX交易所 注册入口: APP下载: 火币交易所: 注册…

    2025年12月11日
    000
  • “Gas空投”是什么?为什么它是最公平的空投方式之一?

    Gas空投通过报销用户交互中的Gas费用来降低参与门槛,精准奖励真实行为。1、项目方利用链上数据识别完成特定操作的地址;2、按实际消耗Gas折算补偿金额,以稳定币或代币发放;3、设定交互次数、功能覆盖等标准,结合分级报销与时间权重,防止巨鲸垄断,提升去中心化与公平性。 “Gas空投”指项目方补偿用户…

    2025年12月11日
    000
  • 什么是合约最大杠杆限制?为什么新账户不能开125倍杠杆

    合约最大杠杆限制是交易所设定的单仓位最高借贷倍数,如125倍即1单位本金可控制125单位合约,能放大收益与风险。不同平台依合约品种设不同上限,并动态调整。新账户常无法直接开通125倍杠杆,主因包括未完成高级认证、无交易记录被归为保守型、存在风险事件或所选合约不支持。用户可通过提升认证等级、增加交易频…

    2025年12月11日
    000
  • 拒绝由于信息差亏钱,这5个币圈必备网站请收藏!

    CoinMarketCap提供全球加密货币数据,支持价格监控与资讯获取;2. CoinGecko强调去中心化与多维评估,助力项目潜力分析;3. TradingView集成实时行情与技术工具,满足专业图表分析需求;4. Dune Analytics通过SQL查询链上数据,实现深度业务洞察;5. Def…

    2025年12月11日
    000
  • 什么是链上随机数?它为何难以生成且至关重要?

    链上随机数是通过去中心化方式生成不可预测数值的机制,用于确保智能合约执行的公平性。由于区块链的确定性特性,直接生成安全随机数困难,主要面临矿工操纵、缺乏熵源及算法可重现等问题。为解决这些挑战,常用方法包括:采用链下预言机如Chainlink VRF提供带加密证明的随机数,利用未来区块哈希作为延迟随机…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信