手把手教你手写一个最简单的 Spring Boot Starter,透彻分析源码

  • @Author Mr.nobody

  • @Date 2021/2/27

  • @Version 1.0

*/

@ConfigurationProperties(prefix = “nobody.json”)

public class MyJsonProperties {

// Starter使用者没在配置文件中配置prefixName属性的值时的默认值

public static final String DEFAULT_PREFIX_NAME = “@”;

// Starter使用者没在配置文件中配置suffixName属性的值时的默认值

public static final String DEFAULT_SUFFIX_NAME = “@”;

private String prefixName = DEFAULT_PREFIX_NAME;

private String suffixName = DEFAULT_SUFFIX_NAME;

public String getPrefixName() {

return prefixName;

}

public void setPrefixName(String prefixName) {

this.prefixName = prefixName;

}

public String getSuffixName() {

return suffixName;

}

public void setSuffixName(String suffixName) {

this.suffixName = suffixName;

}

}

自动装配类,使用 @Configuration 和 @Bean 来进行自动装配,注入 Spring 容器中。

package com.nobody.myjson.config;

import com.nobody.myjson.service.MyJsonService;

import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;

import org.springframework.boot.context.properties.EnableConfigurationProperties;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Configuration;

/**

  • @Description 自动装配类

  • @Author Mr.nobody

  • @Date 2021/2/27

  • @Version 1.0

*/

@Configuration // 标识此类是配置类

@ConditionalOnClass(MyJsonService.class) // 表示只有指定的class在classpath上时才能被注册

@EnableConfigurationProperties(MyJsonProperties.class) // 激活@ConfigurationProperties

public class MyJsonConfiguration {

private MyJsonProperties myJsonProperties;

// 自动注入配置类

public MyJsonConfiguration(MyJsonProperties myJsonProperties) {

this.myJsonProperties = myJsonProperties;

}

// 创建MyJsonService对象,注入到Spring容器中

@Bean

@ConditionalOnMissingBean(MyJsonService.class) // 当容器没有此bean时,才注册

public MyJsonService myJsonService() {

MyJsonService myJsonService = new MyJsonService();

myJsonService.setPrefixName(myJsonProperties.getPrefixName());

myJsonService.setSuffixName(myJsonProperties.getSuffixName());

return myJsonService;

}

}

src/main/resources/META-INF目录下新建 spring.factories 文件,输入以下内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

com.nobody.myjson.config.MyJsonConfiguration

SpringBoot 项目启动时,类加载器会从 META-INF / spring.factories 加载给定类型的工厂实现的完全限定类名。也就是说类加载器得到工程中所有 jar 包中的 META-INF/spring.factories 文件资源,从而得到了一些包括自动配置相关的类的集合,然后将它们实例化,放入 Spring 容器中。

最终项目结构如下:

在这里插入图片描述

在开发工具 IDEA 通过 Maven 的 install 命令进行构建打包。或者在项目的目录下,打开命令行窗口,使用mvn install命令进行构建打包。打包后,会在工程的 target 目录下生成一个 jar 包,并且在 maven 本地仓库也会生成相应的 jar 包。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

使用自定义的 Starter


经过上面几个步骤,我们自定义的 Starter 就开发好了,以下是在其他工程进行引入使用。在需要引用此 Starter 的工程的 pom.xml 文件中引入此依赖。

com.nobody

myjson-spring-boot-starter

0.0.1-SNAPSHOT

刷新依赖,就能在项目的依赖库中看到此依赖了。

在这里插入图片描述

展开,还能查看此 Starter 可以配置的属性项有哪些,如下:

在这里插入图片描述

然后在需要用到的类中进行注入使用即可。

package com.nobody.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;

import com.nobody.domain.Person;

import com.nobody.service.MyJsonService;

@RestController

@RequestMapping(“demo”)

public class DemoController {

// 注入我们Starter中的服务类

@Autowired

private MyJsonService myJsonService;

@GetMapping()

public String test() {

Person p = new Person(“Mr.nobody”, 18, “拉斯维加斯”);

// 调用服务方法

return myJsonService.objectToMyJson§;

}

}

启动项目,在浏览器中访问此接口,得到如下结果:

在这里插入图片描述

如果我们在 application.yml 文件中添加以下配置信息,然后再访问接口的结果如下,也验证了我们可以自定义 Starter 中默认的配置项。

nobody:

json:

prefixName: HH

suffixName: KK

在这里插入图片描述

当我们引入此 Starter 时,SpringBoot 会自动装配,将实例化的 bean 放入 Spring 容器。但我们是否可控制 bean 要不要实例化并放入容器呢?答案是可以做到的。

我们只需要在自动装配类或者类内的方法,通过 @ConditionalOnXXX 注解就能控制。例如如下所示,使用 Starter 使用者在他的项目的配置文件中填写 nobody.json.enable 的值为 false,则就不会自动生成 MyJsonService 实例了。默认不填或者 nobody.json.enable 的值为 true 时,能自动生成 bean 放入容器。这样用户就能自己控制 bean 的实例化了。

// 创建MyJsonService对象,注入到Spring容器中

@Bean

@ConditionalOnProperty(name = “nobody.json.enable”, matchIfMissing = true)

@ConditionalOnMissingBean(MyJsonService.class) // 当容器没有此bean时,才注册

public MyJsonService myJsonService() {

MyJsonService myJsonService = new MyJsonService();

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

面试准备+复习分享:

为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦

秋招|美团java一面二面HR面面经,分享攒攒人品

1711861921812)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-DAva4BSm-1711861921812)]

面试准备+复习分享:

为了应付面试也刷了很多的面试题与资料,现在就分享给有需要的读者朋友,资料我只截取出来一部分哦

[外链图片转存中…(img-F4RHMfCE-1711861921813)]

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用 Spring Boot 3 开发一个后端分离的生产级系统需要以下步骤: 第一步:环境准备 1. 安装 Java 开发工具包(JDK) 2. 安装集成开发环境(IDE),如Eclipse或IntelliJ IDEA 3. 安装Maven构建工具 4. 安装数据库(如MySQL)和相关工具(如MySQL Workbench) 第二步:创建后端项目 1. 使用IDE创建一个新的Spring Boot项目 2. 配置项目的基本信息,如项目名称、包名等 3. 添加必要的依赖,如Spring Boot Starter Web、Spring Data JPA等 4. 定义实体类、控制器、服务等后端代码 第三步:创建前端项目 1. 使用前端开发工具,如Vue.js或React.js,创建一个新的前端项目 2. 配置项目的基本信息,如项目名称、包名等 3. 定义前端路由、页面、组件等前端代码 第四步:前后端集成 1. 在后端项目中配置跨域访问,允许前端项目访问后端接口 2. 在前端项目中调用后端接口,实现数据的交互 第五步:开发和测试 1. 根据需求逐步开发后端和前端功能模块 2. 使用测试框架,如JUnit和Selenium,对系统进行单元测试和端到端测试 第六步:部署和上线 1. 打包后端项目为可执行的JAR文件 2. 部署JAR文件到生产环境的服务器上 3. 配置服务器的环境变量、数据库连接等 4. 启动服务器,验证系统是否正常运行 通过以上步骤,我们可以完成一个使用Spring Boot 3开发的前后端分离的生产级系统。这种架构可以提高开发效率、降低系统耦合性,并且适合大型项目的开发和部署。同时,我们还可以根据实际需求,进一步优化系统性能、可维护性和安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值