企业免费招聘网站,电商网站平台搭建,注册一个公司网站的费用,安阳网站关键词优化Starter是什么 #xff1f;
Spring Boot 对比 Spring MVC 最大的优点就是使用简单#xff0c;约定大于配置。不用 Spring MVC 的时候#xff0c;时不时被 xml 配置文件搞的晕头转向#xff0c;冷不防还因为 xml 配置上的一点疏忽#xff0c;导致整个项目莫名其妙的不可用…Starter是什么
Spring Boot 对比 Spring MVC 最大的优点就是使用简单约定大于配置。不用 Spring MVC 的时候时不时被 xml 配置文件搞的晕头转向冷不防还因为 xml 配置上的一点疏忽导致整个项目莫名其妙的不可用顿感生无可恋。这要归功于Spring Boot 的各种各样的 starters有官方提供以及第三方开源出来的。这些依赖模块都遵循着约定成俗的默认配置并允许我们根据自身情况调整这些配置。基本上你打算用的功能都可以找到如果没有找到那就请再找一找。SpringBoot 会自动扫描需要加载的信息并启动相应的默认配置。
Starter 提供了以下功能
整合了模块需要的所有依赖统一集合到 Starter 中。提供了默认配置并允许我们调整这些默认配置。提供了自动配置类对模块内的 Bean 进行自动装配注入 Spring 容器中。
Starter 命名规则
Spring 官方定义的 Starter 通常命名遵循的格式为 spring-boot-starter-{name}例如 spring-boot-starter-data-mongodb。Spring 官方建议非官方 Starter 命名应遵循 {name}-spring-boot-starter 的格式例如myjson-spring-boot-starter。
Starter可以用来解决什么问题
日常开发中有一些独立于业务系统之外的配置模块它是可以在不同项目中进行复用的。如果在每个项目中都编写重复的模块代码除了浪费时间和人力耦合性还高。将这些可独立于业务代码之外的功能配置模块封装成一个 Starter在需要用到此功能模块的项目中只需要在其 pom.xml 文件中引用依赖即可。
手写SpringBoot启动器的主要步骤
定义业务接口、需要的实体类等业务对象定义配置属性类、定义自动装配类、Resources目录下新建META-INF/spring.factories加入自定义starter的配置项
idea——new project——spring initializr——填写group、artifact名称选择java的jdk版本——next ——next——finish
pom文件依赖 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.4.4/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdmy-starter/artifactId version0.0.1-SNAPSHOT/version namemy-starter/name descriptionDemo project for Spring Boot/description properties java.version1.8/java.version /properties dependencies dependency groupIdcom.example/groupId artifactIdmyjson-spring-boot-starter-autoconfigurer/artifactId version0.0.1-SNAPSHOT/version /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project 在当前工程创建module——name为myjson流程同上?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.4.4/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdmyjson-spring-boot-starter-autoconfigurer/artifactId version0.0.1-SNAPSHOT/version namemyjson-spring-boot-starter-autoconfigurer/name descriptionDemo project for Spring Boot/description properties java.version1.8/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId version2.3.8.RELEASE/version optionaltrue/optional /dependency dependency groupIdcom.alibaba/groupId artifactIdfastjson/artifactId version1.2.73/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-autoconfigure/artifactId version2.3.8.RELEASE/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration mainClasscom.example.myjson.MyjsonApplication/mainClass skiptrue/skip /configuration /plugin /plugins /build /project
加红色的三个依赖fastjson是我们需要的第三方依赖其他的spring-boot-configuration-processor 依赖是可选的加入此依赖主要是打包时自动生成配置元信息文件 META-INF/spring-configuration-metadata.json并放入到 jar 中。绿色的artifact是我们自定义starter的名称蓝色的插件依赖是我们
手写starter
定义我们的service业务类主要是对传入的对象转换为json字符串同时在其首位做额外的拼接处理public class MyJsonService { private String prefixName; private String suffixName; 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; } public String objectToMyJson(Object obj) { return prefixName JSON.toJSONString(obj) suffixName; } } 定义控制的实体类对象public class Person { private String name; private int age; private String address; public Person(String name, int age, String address) { super(); this.name name; this.age age; this.address address; } 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; } public String getAddress() { return address; } public void setAddress(String address) { this.address address; } } 定义我们的属性配置类也即yml配置文件中配置的属性/** * authorcp * time2021-4-12 * Description: 配置类(类名一般为模块名Properties) cp.json为Starter使用者通过yml配置文件动态修改属性值的变量名前缀 */ ConfigurationProperties(prefix cp.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; } } 定义自动装配类让spring装配我们的service业务类同时调用我们的属性配置类让业务service类获取到属性配置类的值并进行处理package com.example.myjson.config; import com.example.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; /** * authorcp * time2021-4-12 * Description: 自动装配类 */ 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; } } 在我们的启动类模块的resources文件下创建META-INF/spring.factories 文件增加如下内容将自动装配的类配置上org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.example.myjson.config.MyJsonConfiguration 上述工作完成后我们可以使用mvn install命令在本地仓库生成我们手写的starter的jar可以提供给他其他工程依赖引用。也可以快捷的使用idea提供的快捷打包新建一个工程名称为kk流程同1中在pom文件中引入我们的starter依赖?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd modelVersion4.0.0/modelVersion parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.4.4/version relativePath/ !-- lookup parent from repository -- /parent groupIdcom.example/groupId artifactIdkk/artifactId version0.0.1-SNAPSHOT/version namekk/name descriptionDemo project for Spring Boot/description properties java.version1.8/java.version /properties dependencies dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency groupIdcom.example/groupId artifactIdmyjson-spring-boot-starter-autoconfigurer/artifactId version0.0.1-SNAPSHOT/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-test/artifactId scopetest/scope /dependency /dependencies build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId /plugin /plugins /build /project 更新maven依赖后可以看我们的自定义starter已经被引入进来在kk工程的resources文件下将application.properties文件改为application.yml并进行如下配置cp: json: prefix-name: hello suffix-name: world 在kkApplication下新建controllerRestController RequestMapping(demo) public class DemoController { Autowired private MyJsonService myJsonService; GetMapping() public String test() { Person p new Person(“千与千寻” , 18, 拉斯维加斯); // 调用服务方法 return myJsonService.objectToMyJson(p); } }
引入我们自定义启动器中的业务service类启动springboot工程访问http://localhost:8080/demo验证我们的service类即可。
中间问题点在打包自定义启动器类jar包本地仓库时没有添加构建插件导致生成包多了一个BOOT-INF的文件无法被其他工程引用导入自定义service类添加如下构建插件后问题解决 build plugins plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration mainClasscom.example.myjson.MyjsonApplication/mainClass skiptrue/skip /configuration /plugin /plugins /build