开发一个Spring Boot Starter!

在上一篇文章中,我们已经了解了一个starter实现自动配置的基本流程,在这一小结我们将复现上一过程,实现一个自定义的starter。

先来分析starter的需求:

  • 在项目中添加自定义的starter依赖,自动在Spring中加载starter中的Bean;
  • 从application.properties中加载指定配置

创建项目

  1. 先创建一个名为starter的项目。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>top.ninwoo</groupId><artifactId>demo-starter</artifactId><version>1.0.0</version><packaging>jar</packaging><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot</artifactId><version>2.1.6.RELEASE</version></dependency></dependencies>
</project>
  1. 在resources中创建一个META-INF的目录,并在目录中创建一个spring.factories。在这个配置中,我们只设置一个EnableAutoConfiguration项,并且对应只设置一个DemoAutoConfig配置类。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=top.ninwoo.config.DemoAutoConfig  
  1. 创建DemoAutoConfig配置类

    package top.ninwoo.config;import org.springframework.boot.context.properties.EnableConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;@Configuration
    @EnableConfigurationProperties(DemoStarterProperties.class)
    public class DemoAutoConfig {@BeanDemoBean demoBean() {return new DemoBean();}
    }

    这个配置类,我们主要使用了@Configuration和@EnableConfigurationProperties两个注解。@EnableConfigurationProperties启用一个ConfigurationProperties。

  2. 创建ConfigurationProperties对应的DemoStarterProperties

    package top.ninwoo.config;import org.springframework.boot.context.properties.ConfigurationProperties;@ConfigurationProperties(prefix = "top.ninwoo.demo")
    public class DemoStarterProperties {private String name = "default";private int age = 0;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
    }

    创建一个ConfigurationProperties类。这个类主要用来从application.properties中读取配置项,并自动设置到相对应的字段上。

  3. 创建一个测试用Bean,并使用ConfigurationProperties类中的信息。

    起初这里有个疑惑,不知道如何使用这个ConfigurationProperties类。不过在spring中最常见的就是Bean,我们可以大胆的猜测通过@ConfigurationProperties注释的类,将自动在Spring容器中自动创建一个Bean。而我们在使用的时候,就通过普通的bean注入方式便可以使用ConfigurationProperties类中的信息。所以,我们这样创建一个测试Bean

    package top.ninwoo;import javax.annotation.Resource;public class DemoBean {@ResourceDemoStarterProperties properties;public String getName() {return properties.getName();}public String getAge() {return getAge();}
    }
    

    同时在DemoAutoConfig中使用@Bean注解创建一个Bean。

到这里,我们的starter就创建完成了。通过mvn打包,或者创建同一个父项目的不同子Module的方式,我们可以进行测试这个starter是否生效。

创建测试类

测试类使用一个spring boot web项目来完成,主要创建了一个RestController,并通过RestController获取Spring上下文中注册的bean names和starter中的测试Bean。

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>top.ninwoo</groupId><artifactId>springboot-demo</artifactId><version>1.0.0</version><parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.boot</groupId><version>2.1.6.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>top.ninwoo</groupId><artifactId>demo-starter</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>

在pom文件中,我们添加了刚刚实现的starter。

RestController:

@RestController
public class IndexController implements ApplicationContextAware {ApplicationContext ctx = null;@ResourceDemoBean demoBean;@RequestMapping("/getList")public String[] getBeanNames() {return ctx.getBeanDefinitionNames();}@RequestMapping("/getDemoBean")public String demoBean() {return demoBean.getName();}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {ctx = applicationContext;}
}

SpringBoot启动类 MainApp:

package top.ninwoo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MainApp {public static void main(String[] args) {SpringApplication.run(MainApp.class, args);}
}

我们可以看到,与正常的一个web项目相比,我们只是添加了一个依赖,而并没有修改启动类。

测试

访问127.0.0.1:8080/getList接口,我们可以看到最后的几个bean Names是:

...,"top.ninwoo.config.DemoAutoConfig","demoBean","top.ninwoo.demo-top.ninwoo.config.DemoStarterProperties"]

这证明,通过注入我们starter依赖,已经在Spring的上下文创建了starter配置类中的Bean。

在没有设置application.properties时,直接访问http://127.0.0.1:8080/getDemoBean,可以获取到测试用的Bean实例中默认的参数配置default.

添加application.properties:

top.ninwoo.demo.name=joliu

重启项目,再次访问该接口,发现测试用的Bean实例对应的属性已经安装配置类中的参数进行设置,返回了joliu。

小结

到这里,我们可以说已经了解了开发一个SpringBoot Starter最基本的流程,我们可以尝试在我们日常的项目中开发这样的starter。

转载于:https://www.cnblogs.com/NinWoo/p/11305650.html

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

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

相关文章

现实世界的虚拟神话

本文摘自&#xff1a;[url]http://www.doserv.com/news/f/2007-03-12/0017031936.shtml[/url]如今&#xff0c;服务器虚拟化已经成为业界的最为热门的话题之一。虚拟化技术自问世以来&#xff0c;人们纷纷为其神奇的效果而赞不绝口。正如VMware创始人兼CEO Diane Greene所说&am…

计算机图形学颜色表示,计算机图形学 颜色表示模型.ppt

计算机图形学 颜色表示模型颜色模型 颜色属于物理学和生物心理学范畴&#xff0c;它是由于光经过与周围环境相互作用后到达人眼&#xff0c;并经过一系列物理和化学变化转化为人眼所能感知的电脉冲的结果&#xff0c;因而。颜色的形成是一个复杂的物理和心理和心理相互作用的过…

揭开SVCHOST.exe进程之谜

svchost.exe是nt核心系统的非常重要的进程&#xff0c;对于2000、xp来说&#xff0c;不可或缺。很多病毒、木马也会调用它。所以&#xff0c;深入了解这个程序&#xff0c;是玩电脑的必修课之一。 大家对windows操作系统一定不陌生&#xff0c;但你是否注意到系统中“svchost.e…

GridView中妙用LinkButton

说明&#xff1a;近来看到不少人想在DataGrid、GridView 使用比较灵活的方式来编辑、查看、删除其中的数据选项&#xff08;当然它们本身也内置了这些功能&#xff09;&#xff0c;却苦于找不到比较好的办法&#xff0c;本人结合实际代码说明一下如何使用LinkButton来实现上述功…

计算机ppt文字1是什么原因,ppt让答案一个个出现,ppt让文字一个个出现

在使用Windows 10工作时会遇到形形色色的问题&#xff0c;比如开机发现无法连接网络。那么如何进行故障排除呢&#xff1f;下面小编与你分享具体步骤和方法。工具/材料Windows 10操作系统操作方法01启动Windows 10操作系统&#xff0c;如图所示。点击任务栏搜索框&#xff0c;开…

Taro-UI 2.0样式在H5上生效,微信小程序不生效?

答案&#xff1a; https://taro-ui.aotu.io/#/docs/questions taro-ui 自定义样式覆盖小程序组件样式使用到了 globalClass 这个微信小程序特性&#xff0c;由于微信小程序的限制&#xff0c;自定义的样式需要在 page 页面内使用&#xff0c;不能基于第三方组件再进行一层封装&…

抢先试用ReSharper UnitRun™ 1.0

在发布又一款免费的VS2005单元测试插件后随即安装了个ReSharper UnitRun™ 1.0玩玩&#xff0c;发现的确有其亮点&#xff0c;尤其喜欢的是在执行单元测试的过程中居然支持调试。 在安装过程中遇到个问题&#xff0c;一个注册的异常&#xff0c;后来到其官网上注册并得到个lice…

湖北工业大学计算机专硕学费,2019年湖北工业大学硕士研究生学费奖助政策

(一)全日制研究生奖助政策&#xff1a;1.对象&#xff1a;为具有中华人民共和国国籍&#xff0c;取得学校研究生学籍&#xff0c;在基本学制年限内、无固定工资收入且人事档案转入我校的全日制非在职研究生。2.奖助标准&#xff1a;(1)符合国家政策的研究生将获得国家助学金0.6…

python day27

今日内容 知识点补充 import jsonfrom datetime import datetime,date""" res {c1:datetime.today(),c2:date.today()} print(json.dumps(res)) 返回结果:TypeError: Object of type datetime is not JSON serializable """ class MyJson(json.…

I must be strong and carry on

扔掉的东西&#xff0c;特别是在时间里丢掉的&#xff0c;永远也回不来了。如我的正在逝去青春。 相信命运和缘分的东西。为什么自己会在这里&#xff0c;会认识周围的人&#xff0c;会和他们成为很好的朋友。努力完成自己的事情&#xff0c;不管成败。成则不骄&#xff0c;败则…

动态css语言less,less让css具有动态语言的特性

Less 是一种样式语言&#xff0c;它将 css 赋予了动态语言的特性&#xff0c;如变量、 继承、 运算、 函数。less 既可以在客户端上运行(支持IE 6, Webkit, Firefox)&#xff0c;也可以借助 Node.js 或者 Rhino 在服务端运行。Less 做为 css 的一种形式的扩展&#xff0c;它并没…

硬件_LED

LED 平台&#xff1a;全志A64 源码&#xff1a;Android 7.1 Linux 3.1 led.c 1 //没有使用平台总线2 3 #include <linux/init.h>4 #include <linux/module.h>5 #include <linux/fs.h>6 #include <linux/device.h>7 #include <linux/slab.h>8 #i…

思科考试报名流程

有考生经常来信来电咨询&#xff0c;关于认证注册和考试报名流程的相关内容&#xff0c;针对这点中国思科注册网就为大家整理了以下详细的解释。 1、报名地点及联系方式&#xff1a;思科考试报名地点&#xff1a;a.选择您所在城市报名点报名&#xff1b;b.选择中国思科注册网报…

水星路由器DNS服务器未响应,水星路由器进不去设置怎么办

摘 要水星路由器进不去设置怎么办&#xff1f;这里要分两种情况&#xff0c;旧版水星路由器与新版水星路由器一、旧版水星路由器 1、当打开水星路由器设置页面&#xff0c;如果提示你输入用户名和密码&#xff0c;如下图所示。说明这是一台旧版本的水星路由器水星路由器进不去设…

DotNet程序员是不是最不幸福?

自我学C#和ASp.net时就来逛DotNet区&#xff0c;总是时不时有人问“学.net是不是没有前途&#xff1f;”&#xff0c;总是有人“报怨.net程序人收入比某某要低”。还有人说“在中国&#xff0c;程序人干不到老。”我也曾心动过&#xff0c;想过放弃。 但是&#xff0c;冷静下来…

zookeeper 简介

什么是ZookeeperZookeeper是一个分布式开源框架&#xff0c;提供了协调分布式应用的基本服务&#xff0c;它向外部应用暴露一组通用服务——分布式同步&#xff08;Distributed Synchronization&#xff09;、命名服务&#xff08;Naming Service&#xff09;、集群维护&#x…

discuz的ajax,discuz分页函数改成基于jqueryd的ajax分页函数

/***AJAX分页*$num 为总共的条数 比如说这个分类下共有15篇文章*$perpage为每页要显示的条数*$curpage为当前的页数*$url为请求路径&#xff0c;*$obj为html对象&#xff0c;返回给jqery处理*$page为$multipage这个字符串中要显示的表示页数的变量个数*$maxpages为最大的页数…

北大青鸟:比尔盖茨:我在微软的10大失误

北大青鸟&#xff1a;比尔盖茨&#xff1a;我在微软的10大失误来源&#xff1a;[url]http://www.accp-teem.com.cn/ArticleView/2007-7-11/Article_View_1172.Htm[/url] 微软上周四宣布&#xff0c;从2008年7月开始&#xff0c;董事会主席比尔盖茨将不再负责公司的日常管理&…

网格 优化光顺

简介 网格光滑在计算机图形学中广泛应用。因为从自然界采集的雕像带有很多的噪声。本文对 论文 Laplacian Mesh Optimization 当然错误难以避免&#xff0c;本人水平不足造成错误&#xff0c;希望读者能给予我及时的反馈&#xff0c;本人感激不尽 使用简介 Laplacian Mesh Opti…

2进制、8进制、10进制、16进制...各种进制间的轻松转换(c#)

在.NET Framework中&#xff0c;System.Convert类中提供了较为全面的各种类型、数值之间的转换功能。其中的两个方法可以轻松的实现各种进制的数值间的转换&#xff1a; Convert.ToInt32(string value, int fromBase)&#xff1a; 可以把不同进制数值的字符串转换为数字&#x…