SpringBoot 优化小妙招,写代码像写诗

Spring应用启动分析&优化 采集Spring应用启动过程数据,生成交互式分析报告(HTML),用于分析Spring应用启动卡点,优化Spring应用启动速度 阅读详情
  • 1.定义配置文件信息

  • 2. 用@RequiredArgsConstructor代替@Autowired

  • 3.代码模块化

  • 4. 抛异常而不是返回

  • 5. 减少不必要的db

  • 6. 不要返回null

  • 7. if else

  • 8. 减少controller业务代码

  • 9. 利用好Idea

  • 10. 阅读源码

  • 11. 设计模式

  • 12. 拥抱新知识

  • 13. 基础问题

  • 14. 判断元素是否存在

到代码优化,很多人上来就是各种理论、架构、核心思路;其实优化这个事情说简单也简单,说复杂也可以很复杂,但是我觉得最重要的就是要有一个良好的编码习惯,代码"屎山”并非一朝一夕形成的,往往是经过了日积月累;因此,培养一个好的习惯,可以让我们的代码变的更加优雅、易维护,系统变的更加健壮;下面就分享14个小技巧,让优化变成顺手就完成的小事儿;

1. 定义配置文件信息

有时候我们为了统一管理会把一些变量放到 yml 配置文件中;而不是到处设置“魔数”,一旦那天需要修改,只需要修改配置文件即可,不需要满项目去搜索替换;

  • 例如

    用 @ConfigurationProperties 代替 @Value

  • 使用方法

    定义对应字段的实体

    @Data
    // 指定前缀
    @ConfigurationProperties(prefix = "developer")
    @Component
    public class DeveloperProperty {
        private String name;
        private String website;
        private String qq;
        private String phoneNumber;
    }
    @Data
    // 指定前缀
    @ConfigurationProperties(prefix = "developer")
    @Component
    public class DeveloperProperty {
        private String name;
        private String website;
        private String qq;
        private String phoneNumber;
    }
    

    使用时注入这个bean

    @RestController
    @RequiredArgsConstructor
    public class PropertyController {
     
        final DeveloperProperty developerProperty;
     
        @GetMapping("/property")
        public Object index() {
           return developerProperty.getName();
        }
    }
    

2. 用@RequiredArgsConstructor代替@Autowired

我们都知道注入一个 bean 有三种方式哦(set 注入,构造器注入,注解注入),Spring 推荐我们使用构造器的方式注入 Bean

我们来看看上段代码编译完之后的样子

对了,最近我整理了上百本电子书/软件/视频以及面试题,还在持续更新中,全部免费,文档地址:

https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ

@RequiredArgsConstructor 注解由lombok提供

3.代码模块化

阿里巴巴 Java 开发手册中说到每个方法的代码不要超过 50 行(我没记错的话),在实际的开发中我们要善于拆分自己的接口或方法, 做到一个方法只处理一种逻辑,说不定以后某个功能就用到了, 拿来即用。

4. 抛异常而不是返回

在写业务代码的时候,经常会根据不同的结果返回不同的信息,尽量减少返回,会显得代码比较乱

  • 反例

  • 正例

5. 减少不必要的db

尽可能的减少对数据库的查询

举例子

删除一个服务(已下架或未上架的才能删除),之前有看别人写的代码,会先根据id查询该记录,然后做一些判断

  • 反例

  • 正例

6. 不要返回 null

避免调用方法时,造成不必要的空指针

  • 反例

  • 正例

7. if else

不要太多了if else if,可以试试策略模式代替

8. 减少controller业务代码

业务代码尽量放到service层进行处理,后期维护起来也好操作而且美观

对了,最近我整理了上百本电子书/软件/视频以及面试题,还在持续更新中,全部免费,文档地址:

https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ

  • 反例

  • 正例

9. 利用好IDEA

目前为止市面上的企业基本都用idea作为开发工具了吧

举一个小例子

IDEA会对我们的代码进行判断,提出合理的建议

例如:

它推荐我们用lanbda的形式代替,点击replace

10. 阅读源码

一定要养成阅读源码的好习惯包括优秀的开源项目GitHub上stars:>1000, 会从中学好好多知识包括其对代码的设计思想以及高级API,面试加分(好多面试官习惯问源码相关的知识)

11. 设计模式

23种设计模式,要尝试代码中运用设计模式思想,写出的代码即规范又美观还高大上哈哈。

12. 拥抱新知识

像我们这种工作年限少的程序员,我觉得要多学习自己认知之外的知识,不能每天crud,有机会就多用用有点难度的知识,没有机会(项目较传统),可以自己下班多些相关demo练习

13. 基础问题

  • Map遍历

    HashMap<String, String> map = new HashMap<>();
    map.put("name", "du");
    for (String key : map.keySet()) {
       String value = map.get(key);
    }
     
    map.forEach((k, v) -> {
    });
     
    // 推荐
    for (Map.Entry<String, String> entry : map.entrySet()) {
     
    }
    
  • optional 判空

    //获取子目录列表
    public List<CatalogueTreeNode> getChild(String pid) {
        if (V.isEmpty(pid)) {
            pid = BasicDic.TEMPORARY_DIRECTORY_ROOT;
        }
        CatalogueTreeNode node = treeNodeMap.get(pid);
     
        return Optional.ofNullable(node)
                  .map(CatalogueTreeNode::getChild)
                  .orElse(Collections.emptyList());
    }
    
  • 递归

    大数据量的递归时,避免在递归方法里new对象,可以试试把对象当作方法参数进行传递使用

  • 注释

    类 接口方法 注解 较复杂的方法 注释都要写而且要写清楚, 有时候写注释不是给别人看的 而是给自己看的

14. 判断元素是否存在

hashSet 而不是 list,list 判断一个元素是否存在的代码

ArrayList<String> list = new ArrayList<>();
 
// 判断a是否在list中
 
for (int i = 0; i < list.size(); i++)
       if ("a".equals(elementData[i]))
          return i;

由此可见其复杂度为On,而hashSet底层采用hashMap作为数据结构进行存储,元素都放到map的key(即链表中)

HashSet<String> set = new HashSet<>();
 
// 判断a是否在set中
 
int index = hash(a);
 
return getNode(index) != null

由此可见其复杂度为O1。

记一次SpringBoot启动优化实践 有这种想法的原因是因为我在个人项目中使用过,因为这个项目刚起步,的内容没那么多,随便设置几个JVM参数,堆内存设置大点,启动速度也就两三秒,不设置JVM参数,启动速度大概。而我在项目中使用,因为是本地,JVM参数并没有设置过,堆内存最小就是电脑内存的 1/64,最大就是内存的 1/4。尤其是需要频繁改代码,频繁重启项目的时候,每次项目启动起码都要两分钟才能启动完毕,挺影响开发效率的。主要是我理解的误区,我以为堆内存设置的足够大,减少 GC 频率,就可以提高启动速度。对于思路1,就不多说了。 阅读详情

相关推荐

Spring Boot 启动时间优化全攻略

随着 Spring Boot 的广泛应用,开发者享受到了快速开发和自动化配置的便利。然而,随着项目复杂度的增加,Spring Boot 项目启动时间也变得越来越长,这在开发、调试和部署阶段可能会成为效率瓶颈。如何优化 Spring Boot 的启动时间,已经成为开发者和运维人员关注的重要问题。 本文将详细分析影响 Spring Boot 启动时间的主要因素,并提供一套从配置优化代码调整的全方位优化方案,帮助开发者显著缩短项目的启动时间。

fudaihb的博客 3361

提升Spring Boot程序启动速度的七大优化技巧

Spring Boot提供了自动配置机制,根据应用程序的依赖项和配置,自动配置各种组件。通过持续的优化和调整,您可以构建出性能卓越的Spring Boot应用程序,提供更好的用户体验和高效的系统运行。另外,您还可以选择更轻量级的替代品或自定义的实现,以减少依赖项的数量和大小。:在Spring Boot 2.3及更高版本中,引入了快速启动模式,它可以明显减少应用程序的启动时间。与传统的数据库相比,嵌入式数据库的启动速度更快,并且不需要额外的配置和安装。这样可以延迟初始化非必需的bean,加快启动速度。

weixin_51702416的博客 1万+

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地"最后一公里"困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过"碎石路-高速公路"双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 3393

springboot如何优化启动速度

spring.main.lazy-initialization属性,配置为true,会将所有的bean延时初始化。

qq_34989829的博客 831

14 个 SpringBoot 优化妙招代码写诗

有时候我们为了统一管理会把一些变量放到 yml 配置文件中;而不是到处设置“魔数”,一旦那天需要修改,只需要修改配置文件即可,不需要满项目去搜索替换;例如用 @ConfigurationProperties 代替 @Value使用方法定义对应字段的实体@Data// 指定前缀@Component@Data// 指定前缀@Component使用时注入这个bean。

kangbin825的专栏 1040

14个SpringBoot优化妙招,看完后同事说代码写诗

每次聊到代码优化,都会有很多人说理论、架构、核心思路,其实我觉得代码优化这事说简单了很简单,说复杂了吧它也有一定的难度,但是我觉得有一个良好的编码习惯很重要,下面分享一下14个springboot项目中优化代码的小技巧,让代码优化跟容易,就像完成一件小事。一定要养成阅读源码的好习惯包括优秀的开源项目GitHub上stars:>1000, 会从中学好好多知识包括其对代码的设计思想以及高级API,面试加分(好多面试官习惯问源码相关的知识,推荐公众 号Java精选,回复java面试,获取面试资料,支持在线刷题)

程序员高级码农的博客 1185

聊聊SpringBoot应用启动优化

随着业务发展,线上业务jar 包越来越大,动不动就几百兆,启动时间也越来越慢,严重影响效率。目前大部分java项目都是使用SpringBoot,这篇文章就来简单聊聊关于SpringBoot应用启动优化。对于一个“历史悠久”的项目,业务代码自然是指数增长,而且在日常业务开发中,我们我都是在做加法,很少会去做删代码之类的操作。另外一般项目都会有很多中间件的初始化,比如:数据连接、redis连接、mq生产者和消费者注册、dubbo生产者和消费者注册、定时任务等;

Huangjiazhen711的博客 3269

Spring应用启动很慢?试试这个工具

首先通过项目给出的HTML样例报告来看看此工具提供的分析功能。把报告内容的细节部分收起来,可以看到如下图所示的内容:启动的统计数据。其中包括:启动时间、Bean的数量、使用/总共的jar包数量、未使用/总共的jar包数量及ClassLoader数量;Spring Bean初始化数据,采集了每个Spring Bean初始化时间及其详细内容;Bean初始化时间线。通过时间线的方式,清晰地展现了Spring应用启动过程中,各个Bean的顺序关系及时间消耗;方法调用详细信息(可配置)。

架构大数据双料架构师的博客 1908

告别 “屎山” 代码,务必掌握这14 个 SpringBoot 优化妙招

有时候我们为了统一管理会把一些变量放到 yml 配置文件中;而不是到处设置“魔数”,一旦那天需要修改,只需要修改配置文件即可,不需要满项目去搜索替换;

kangbin825的专栏 1110

SpringBoot性能优化秘籍:启动速度提升300%的6个关键技巧

Spring Boot 是由 Pivotal 团队提供的框架,用于简化 Spring 应用的初始搭建以及开发过程。它通过提供默认配置,让开发者能够快速地构建独立的、生产级别的 Spring 应用程序。Spring Boot 采用了约定大于配置的原则,极大地减少了样板代码和配置文件的编,使得开发人员可以更加专注于业务逻辑的实现。例如,传统的 Spring 项目需要大量的 XML 配置文件来定义 Bean、数据源等信息,而 Spring Boot 可以通过注解和简单的配置文件快速完成这些配置。

梵心白莲的博客 2545

SpringBoot应用启动优化

经历这么一个优化过程,我们发现,能定位到关键问题是非常关键的。而透过错综复杂的现象,能看到问题的本质是非常考验能力与经验的。

jvjkfd的博客 1648

优化SpringBoot程序启动速度

一般在 SpringBoot 中都拥有很多的耗时任务,比如数据库建立连接、初始线程池的创建等等

ThinkStu的博客 10万+

机器人外接 USB 音响完整配置指南

摘要:本文介绍了为机器人配置外接音响的方法。由于内置音响音量小且有散热噪音,建议使用Type-C接口外接音响。配置步骤包括:1)通过aplay -l命令查看音响端口信息;2)使用aplay命令测试音频播放;3)通过amixer命令设置音量。关键点在于正确识别音响的卡号(如card 2)和设备号(如device 0),并在命令中准确配置这些参数即可实现外接音响的正常使用。

m0_47999117的博客 322

Exchange 2016 安装部署.pptx

Exchange 2016安装部署1.前言2.Exchange 2016 的体系结构3.Exchange 2016 早期版本共存4.Exchange 2016 的网络和目录服务器要求 5.Exchange 2016 的硬件要求 6.Exchange 2016 的受支持的操作系统 7.Exchange 2016 .NET Framework8.安装Windows Server2012 R29.Active Directory 准备 10.部署Exchange Server 2016

上一篇: SpringBoot利用ThreadPoolTaskExecutor批量插入百万级数据实测!
下一篇: SpringBoot 打造图片阅后即焚功能
Java布道者
博客等级 码龄5年 3653粉丝 464原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值