理解了springboot那些约定俗成的Java类命名规范,就很容易读懂springboot的源代码

news2024/12/28 3:33:57

去阿里面试,由于简历上写了读过 spring 的源码,所以面试官就问到了:看你读过 spring 的源码,可以介绍一下他的流程么?

肚子好像很多,但是脑子关于spring相关概念,很好混乱,回答的……

那怎办呢?何不试一下,找一下springboot那些约定俗成的Java类命名规范,来辅助自己更好的理解与记忆springboot的源代码

spring框架类命名

IXXX,XXXXImpl:

IXXX一般是接口类,以I开头,表示Interface,XXXXImpl是针对接口的具体实现,表示implement。

Spring 实现接口,多实现时动态加载符合要求的实现类。

项目中经常存在根据模型的某个字段值走不同的处理逻辑,此时我们遵循开闭原则会将处理逻辑抽象成某个接口;调用的时候根据具体传值判断调用哪一个实现类,以往我们可能会使用 策略模式+工厂模式 实现。这篇文章将使用注解+动态代理取代。

如:策略模式+工厂模式实现
以付款为例 支付宝付款、微信付款、银行卡付款。。

1、模型准备

@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayModel {

    /**
     * 付款方式 (支付宝付款、微信付款、银行卡付款)
     * 省略枚举 alipay、wechat、bankcard
     */
    private String payType;

    /**
     * 付款金额
     */
    private BigDecimal paymentAmt;
}

2、接口定义

public interface PayService {
    /**
     * 付款
     */
    Boolean pay(PayModel payModel);
}

3、提供接口实现类

@Service("alipay")
public class AliPayServiceImpl implements PayService {
    @Override
    public Boolean pay(PayModel payModel) {
        System.out.println("支付方式:" + payModel.getPayType() + "---------------" + "支付金额:" + payModel.getPaymentAmt());
        System.out.println("支付处理逻辑。。。。。");
        return Boolean.TRUE;
    }
}
@Service("bankcard")
public class BankCardPayServiceImpl implements PayService {
    @Override
    public Boolean pay(PayModel payModel) {
        System.out.println("支付方式:" + payModel.getPayType() + "---------------" + "支付金额:" + payModel.getPaymentAmt());
        System.out.println("支付处理逻辑。。。。。");
        return Boolean.TRUE;
    }
}
@Service("wechat")
public class WechatPayServiceImpl implements PayService {
    @Override
    public Boolean pay(PayModel payModel) {
        System.out.println("支付方式:" + payModel.getPayType() + "---------------" + "支付金额:" + payModel.getPaymentAmt());
        System.out.println("支付处理逻辑。。。。。");
        return Boolean.TRUE;
    }
}

为了取巧 我们定义实现类时 将bena的唯一标识置为 alipay、wechat、bankcard

4、提供工厂

@Component
public class PayFactory {

    @Autowired
    //此时map中的key 即是 alipay、wechat、bankcard
    private Map<String, PayService> payServiceMap;

    public PayService getPayService(String type){
        PayService payService = payServiceMap.get(type);
        if(payService == null) {throw new NullPointerException("未找到类型为【"+type+"】的支付方式实现类");}
        return payService;
    }
}

5、控制层 + postman调用

@RestController
@RequestMapping("/dy")
public class PayController {

    @Autowired
    private PayFactory payFactory;

    @PostMapping("/pay")
    public Boolean pay(@RequestBody PayModel payModel){
        PayService payService = payFactory.getPayService(payModel.getPayType());
        return payService.pay(payModel);
    }
}

 


Bootstrap,Starter:

一般作为程序启动器使用,或者作为启动器的基类。通俗来说,可以认为是main函数的入口。

starter启动器,可以通过启动器集成其他的技术,比如说: web, mybatis, redis等等.可以提供对应技术的开发和运行环境.
比如: pom中引入spring-boot-starter-web, 就可以进行web开发.


Initializer:

初始化启动。

Spring Initializer 是一个用于创建和初始化 Spring 项目的Web界面或命令行工具。

它提供了一个简单易用的界面,让开发人员可以快速生成和配置基于 Spring 的项目结构,并且可以选择添加额外的依赖、配置文件和其他项目设置。

使用 Spring Initializer,您可以指定项目的基本信息(如项目名称、包名等),选择所需的 Spring Boot 版本和语言(如 Java、Kotlin、Groovy),添加所需的依赖(如 Web、数据库访问、安全等),并自动生成一个可用的 Spring 项目的初始代码结构。

Spring Initializer 支持多种方式创建项目,包括:

在浏览器中访问 https://start.spring.io/,填写相关配置信息后,点击生成项目。
使用 Spring Tool Suite(STS)或 IntelliJ IDEA 等集成开发环境的 Spring Initializer 插件。
通过命令行工具(如 curl 或 HTTPie)发送 HTTP 请求来生成项目文件。
通过 Spring Initializer 创建的项目已经为您配置好了一些基本的 Spring Boot 设置,如自动配置、依赖管理、应用程序入口类等。

您可以根据需要进一步修改和定制项目,以满足特定的开发需求。

Processor:

某一类功能的处理器,用来表示某个处理过程,是一系列代码片段的集合。

Processor是spring Bean生命周期关键触发时机

根据上图可知,实际bean对象涉及生命周期的主要是一个构造器和两个后置处理器(BeanFactoryPostProcessor和BeanPostProcessor)。

BeanPostProcessor与BeanFactoryPostProcessor的初始化、调用的不同时机,正是由于它们的作用不同导致作用域不同决定的。

BeanPostProcessor是针对Bean级别的处理,可以针对某个具体的Bean;而BeanFactoryPostProcessor针对整个Bean的工厂(BeanFactory)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1126908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[SQL开发笔记]AND OR运算符:基于一个以上的条件对记录进行过滤

上一篇博客示范了在where子句中使用一个条件进行查询&#xff0c;如果需要多个条件限制呢&#xff1f;需要使用and或or运算符&#xff1b; 一、功能描述&#xff1a; 用于基于一个以上的条件对记录进行过滤 二、AND & OR语法详解&#xff1a; 1.and运算符&#xff08;co…

电子标签模块:让传感器智能化,工程安全监测更便捷

电子标签模块&#xff1a;让传感器智能化&#xff0c;工程安全监测更便捷 在之前的文章《振弦传感器的发展及信息化的核心技术-VM系列振弦采集模块》中&#xff0c;我们提到了河北稳控科技研发并批量生产的激励测读模块&#xff08;振弦采集模块&#xff09;&#xff0c;该模块…

医院绩效考核系统源码,医院绩效考评管理系统全套成品源码

医院综合绩效核算系统全套源码 &#xff08;医院实际应用案例自主版权演示&#xff09; 医院绩效考核系统以医院的发展战略为导向&#xff0c;把科室、员工的绩效考核跟战略发展目标紧密结合&#xff0c;引导医院各个科室、各员工的工作目标跟医院的发展目标结合在一起&#x…

基于遥感影像的分类技术(监督/非监督和面向对象的分类技术)

遥感图像分类技术 “图像分类是将土地覆盖类别分配给像素的过程。例如&#xff0c;类别包括水、城市、森林、农业和草原。”前言 – 人工智能教程 什么是遥感图像分类&#xff1f; 遥感图像分类技术的三种主要类型是&#xff1a; 无监督图像分类监督图像分类基于对象的图像分析…

滤波器设计工具简介

目录 快速入门 设计滤波器 查看其他分析 更改轴单位 标记数据点 优化设计 更改分析参数 导出滤波器 生成 MATLAB 文件 量化滤波器 目标 其他功能 此示例说明如何使用方便的滤波器设计工具替代命令行滤波器设计函数。 滤波器设计工具是 Signal Processing Toolbox™…

Python 下载首页图片

以下是一个使用RoboBrowser和Python下载首页图片的下载器程序&#xff0c;并使用https://www.duoip.cn/get_proxy获取代理&#xff1a; import os import time from robobrowser import RoboBrowser import requests ​ def get_proxy():url "https://www.duoip.cn/get_…

【Linux】Centos 8 服务器部署:阿里云端口开放与应用实例教程

目录 一、基本流程 二、进入实例安全组 &#xff08;1&#xff09;进入实例详情 &#xff08;2&#xff09;打开安全组列表 三、配置规则 &#xff08;1&#xff09;默认安全组 &#xff08;2&#xff09;自定义安全组 ① 创建安全组添加入方向端口 ② 编辑安全组导入…

紫光同创FPGA实现图像去雾 基于暗通道先验算法 纯verilog代码加速 提供2套工程源码和技术支持

目录 1、前言免责声明本去雾模块的特点 2、目前我这里已有的图像处理方案3、设计思路框架SD卡初始化SD卡读操作SD卡读图片OV5640摄像头配置及采集HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块 图像去雾模块详解HDMI输出 4、PDS工程1详解&#xff1a;SD卡提供有雾图片5、P…

用“qwer”打造类似梦幻西游中比巧克力还丝滑的状态机

点击上方亿元程序员关注和★星标 引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华&#xff0c;欢迎大家关注分享收藏订阅。 梦幻西游是流量密码吗&…

Trace 在多线程异步体系下传递最佳实践

JAVA 线程异步常见的实现方式有&#xff1a; new ThreadExecutorService 当然还有其他的&#xff0c;比如fork-join&#xff0c;这些下文会有提及&#xff0c;下面主要针对这两种场景结合 DDTrace 和 Springboot 下进行实践。 引入 DDTrace sdk <properties><java.…

Sui特性将推动下一波游戏大发展

随着游戏行业的竞争日益激烈&#xff0c;区块链技术为游戏工作室提供了必要的优势&#xff0c;以保持观众对他们的兴趣。实际上&#xff0c;区块链技术可能是未来游戏设计中最令人愉快和吸引人的关键。游戏在深入探索世界方面表现很棒&#xff0c;它们通过视觉、叙事和社区建设…

Scala入门到放弃—02—函数

文章目录 函数方法定义默认参数命名参数可变参数条件语句循环表达式 函数 方法定义 def 方法名(参数: 参数类型): 返回值类型 {//方法体//最后一行作为返回值(不需要使用return) } def max(x: Int, y: Int): Int {if(x > y)xelse y }package org.example object App {de…

C++ 模板的编译链接讨论

//头文件 #ifndef Test_h__ #define Test_h__ template<class T> class Test1 { public: static T Add(const T& x, const T& y); }; #endif // Test_h__ //cpp文件 #include "Test.h" template<class T> T Test1<T>::Add(const …

Qt 案例 使用QNetworkReply或者URLDownloadToFile 下载http、https资源到本地路径

Qt 使用QNetworkReply或者URLDownloadToFile两种不同方式下载http、https链接资源文件&#xff0c;并且获取下载进度。 目录 一、 使用 URLDownloadToFile 下载二、 使用 QNetworkReply 下载三、 打包好的可执行程序示例下载四、 会员或订阅专栏下载源码 一、 使用 URLDownload…

USB协议学习(二)设备枚举过程分析

USB协议学习&#xff08;二&#xff09;设备枚举过程分析 笔者来聊聊设备枚举过程分析. 这里写自定义目录标题 USB协议学习&#xff08;二&#xff09;设备枚举过程分析USB设备运行过程USB设备枚举USB设备通信构成USB设备请求USB枚举过程分析如何改变文本的样式插入链接与图片如…

【算法训练-动态规划 二】【线性DP问题】最长递增子序列

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【动态规划】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…

跨境电商:经济合作新引擎,技术赋能新亮点

随着数字化浪潮席卷全球&#xff0c;跨境电商正蓬勃发展&#xff0c;成为中国外贸高质量发展的新引擎。中国的跨境电商行业在"买全球、卖全球"方面正经历着显著的增长&#xff0c;延展出新的商业生态&#xff0c;以技术创新和国际合作为支撑&#xff0c;促进了中国制…

Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)

Linux中的shell外壳与权限[包含目录文件的权限,粘滞位的来龙去脉] 一.shell外壳的理解1.为什么需要有shell外壳的存在?2.什么是shell外壳?3.shell外壳的运行原理是什么?4.shell和bash的关系 二.Linux中的用户权限1.用户分类与身份切换1.用户分类2.root用户切换为普通用户1.s…

操作系统学习笔记7-IO管理

文章目录 1、IO管理学什么(学习逻辑图)2、IO管理硬件知识-IO设备的分类(硬件分类)3、IO管理硬件知识-IO控制方式的发展过程4、IO管理硬件知识-IO控制方式-程序直接控制方式5、IO管理硬件知识-IO控制方式-中断控制方式6、IO管理硬件知识-IO控制方式-DMA控制方式7、IO管理硬件知识…

JSX 样式处理

学习目标&#xff1a; 能够在 JSX 中实现 CSS 样式处理  1. 行内样式 实现&#xff1a; 在元素身上绑定一个 style 样式   - 行内样式 style function APP(){return (<div className"App"><div style{{color:red,fontSize:10px}}>this is div</d…