深入springboot原理——动手封装一个starter
从上一篇文章《》
我们已经知道springboot的起步依赖与自动配置的机制。spring-boot-starter-xxx是官方提供的starter,xxx-spring-boot-starter是第三方提供的starter。starter.jar提供jar引入,autoconfigure.jar实现自动配置。下面我们就来封装一个自己的starter。
准备要封装的组件
新建组件com-itpsc-service
pom文件
<groupid>com.itpsc</groupid> <artifactid>com-itpsc-service</artifactid> <version>1.0-snapshot</version> <packaging>jar</packaging> <name>com-itpsc-service</name> <description>com-itpsc-service</description>
编写userservice类
package com.itpsc.service; public class userservice { private string username; private string password; ... }
打包发布组件
idea终端里面输入命令mvn install package打包到maven仓库。
新建一个starter
新建一个名称为itpsc-spring-boot-starter启动组件
引入spring-boot-starter、spring-boot-autoconfigure、spring-boot-configuration-processor
这些jar在编写自动配置类、注解、生成配置元数据处理等功能依赖的jar包。
<groupid>com.itpsc.spring.boot</groupid> <artifactid>itpsc-spring-boot-starter</artifactid> <version>1.0-snapshot</version> <packaging>jar</packaging> <dependencies> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter</artifactid> <version>2.0.4.release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-autoconfigure</artifactid> <version>2.0.4.release</version> </dependency> <dependency> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-configuration-processor</artifactid> <version>2.0.4.release</version> </dependency> <dependency> <groupid>com.itpsc</groupid> <artifactid>com.itpsc.service</artifactid> </dependency> </dependencies
编写自动配置类
userproperties.java,使用@configurationproperties注解将配置文件(yml/properties)中指定前缀的配置转为bean。
package com.itpsc.spring.boot.starter; ... @configurationproperties(prefix = "com.itpsc") public class userproperties { private string username; private string password; ... }
userautoconfiguration.java,@configuration 注释使类成为bean的工厂。
@enableconfigurationproperties注解使@configurationproperties注解生效。
package com.itpsc.spring.boot.starter; ... @configuration @enableconfigurationproperties(userproperties.class) public class userautoconfiguration { @bean public userservice getbean(userproperties userproperties) { //创建组件实例 userservice userservice = new userservice(); userservice.setusername(userproperties.getusername()); userservice.setpassword(userproperties.getpassword()); return userservice; } }
配置spring.factories文件
\meta-inf\spring.factories该文件用来定义需要自动配置的类,springboot启动时会进行对象的实例化,会通过加载类springfactoriesloader加载该配置文件,将文件中的配置类加载到spring容器。
在src/main/resources新建meta-inf文件夹,在meta-inf文件夹下新建spring.factories文件。配置内容如下:
org.springframework.boot.autoconfigure.enableautoconfiguration=\ com.itpsc.spring.boot.starter.userautoconfiguration
打包发布starter
idea终端里面输入命令mvn install package打包到maven仓库。
测试starter
我们在springboot-mybatis-demo项目中引入starter
<dependency> <groupid>com.itpsc.spring.boot</groupid> <artifactid>itpsc-spring-boot-starter</artifactid> <version>1.0-snapshot</version> </dependency>
当在yml中配置username、password时就可以看到有自动提示了,这是因为引入的jar中包含了元数据文件,详细见下文。
com: itpsc: username: "itpsc" password: itpsc@123
元数据文件是在编译器通过处理所有被@configurationproperties注解的节点来自动生成的。
测试在增加一个测试方法
@autowired private userservice userservice; @test public void testitpscstarter() { userservice.print(); }
运行结果:
2019-01-23 20:22:41.615 info 17184 --- [ main] .i.springbootmybatisdemoapplicationtests : started springbootmybatisdemoapplicationtests in 11.505 seconds (jvm running for 14.582) username=itpsc password=itpsc@123
从运行结果可以看出,我们封装的starter中的jar包的bean已经完成了自动配置,说明我们的starter封装成功了。下面补充下上文提到的元数据相关知识。
元数据
springboot jar包含元数据文件,提供所有支持的配置属性的详细信息。这些文件旨在允许ide开发人员在用户使用application.properties 或application.yml文件时提供上下文帮助和自动补全 。
主要的元数据文件是在编译器通过处理所有被@configurationproperties注解的节点来自动生成的。
配置元数据位于jar文件中的meta-inf/spring-configuration-metadata.json,它们使用一个具有”groups”或”properties”分类节点的简单json格式。
{ "sourcetype": "org.springframework.boot.autoconfigure.web.serverproperties", "defaultvalue": 8080, "name": "server.port", "description": "server http port.", "type": "java.lang.integer" }, { "defaultvalue": "\/", "deprecated": true, "name": "server.servlet-path", "description": "path of the main dispatcher servlet.", "type": "java.lang.string", "deprecation": { "level": "error", "replacement": "server.servlet.path" }
这两个json节点server.port、server.servlet-path对应可以在yml或者properties文件中定义
server: port: 8081 context-path: /
如果不知道spring是否支持某个配置的话,可以查看元数据文件看是否有对应的节点。
上一篇: 破解MYSQL密码方法大全
下一篇: 注册表解锁之REG格式与BAT格式的转换