创建一个starter,在其他项目应用此starter,可以灵活打印被引用的starter里的 helloXXXX,通过配置文件可以修改XXXX
- 创建jar项目
创建过程过多废话,你懂得
- 修改pom
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>ts</artifactId>
<version>0.0.2-SNAPSHOT</version>
<name>ts</name>
<packaging>jar</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--以下autoconfigure和lombok是我加的-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.4.3</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.12</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.example.ts.TsApplication</mainClass>
</configuration>
<!-- <executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions> 注意这里-->
</plugin>
</plugins>
</build>
</project>
- HelloProperties :创建自己的属性配置类,有此类才会读取到application.yml里你定义的属性,此类必须加@ConfigurationProperties注解(代码如下)
package com.example.ts.properties;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
1. Created by wx on 2021/2/28.
*/
@Setter
@Getter
@ConfigurationProperties(prefix = "hello")//它可以让开发者将整个配置文件,映射到对象中,比@Value 效率更高。
public class HelloProperties {
/**
* 默认值
*/
private static final String MSG = "world";
private String msg = MSG;
}
- HelloService :写个service,里边可以写业务逻辑,本例根据此类的存在与否创建bean,当然这个service也可以是第三方的类
package com.example.ts.service;
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Service;
/**
* Created by wx on 2020/10/30.
* 判断依据类 ,逻辑类
*/
//@Service
@Setter
@Getter
public class HelloService {
private String msg;
public String sayHello(){
return "Hello" + msg;
}
}
- HelloAutoConfiguration :自动配置类,这个类最重要,是自动配置的最重要的类, 这个类要用到4个类注解,2个方法注解
package com.example.ts.autoConfiguraution;
import com.example.ts.properties.HelloProperties;
import com.example.ts.service.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Created by wx on 2021/2/28.
*/
@Configuration//定义配置类,可当做之前的xml
@ConditionalOnProperty(prefix="hello",value = "enabled",matchIfMissing=true)//来控制@Configuration是否生效
@EnableConfigurationProperties(HelloProperties.class)//次注解可以使HelloProperties的@ConfigurationProperties起作用
@ConditionalOnClass(HelloService.class)//类路径有才会加载
public class HelloAutoConfiguration {
@Autowired
private HelloProperties helloProperties;
@Bean
@ConditionalOnMissingBean(HelloService.class)
public HelloService testervice(){
HelloService helloService = new HelloService();
helloService.setMsg(helloProperties.getMsg());
return helloService;
}
}
- apring.factories:注解配置文件,这个文件是自动配置的标志
在src/main/resources里创建META-INF文件夹,创建文件apring.factories文件(内容如下)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.ts.autoConfiguraution.HelloAutoConfiguration
注意,如果有多个配置类就用逗号隔开,\是为了换行仍然能读到属性
多个自动配置类时如下图,与本例无关,帮助理解格式
好了,下图是我刚创建的这个简单starter的源码结构图
6. 构建打成jar包,如下图
7.把ts-0.0.1-SNAPSHOT.jar使用maven的安装到本地命令上传的本地私库
mvn install:install-file -Dfile="D:\workspace\cmtj\ts\target\ts-0.0.1-SNAPSHOT.jar" -DgroupId=com.example -DartifactId=ts -Dversion=0.0.1-SNAPSHOT -Dpackaging=jar
打开我的私库查看,是有ts-0.0.1-SNAPSHOT.jar 的 如下图
8.找随便一个项目adapter-provider加入引用构建之后进行测试
<dependency>
<groupId>com.example</groupId>
<artifactId>ts</artifactId>
<version>0.0.2-SNAPSHOT</version>
</dependency>
9.在adapter-provider这个工号才能管理引用项目里的application.ym里创建hello配置信息,如下图
@Autowired
private HelloService helloService;
@RequestMapping(value = "/test")
public String test(){
System.out.println(helloService.sayHello());
return helloService.sayHello();
}
启动adapter-provider,访问/test接口,测试成功
ps:启动adapter-provider时在ts这个stater中文件启动顺序
1:HelloProperties.class的getMsg方法,setMsg方法
2:HelloAutoConfiguration的testervice方法
3:HelloProperties.class的getMsg方法