一、springboot实现配置文件的动态刷新
实现方式是通过spring-cloud-config和spring-boot-actuator组合共同实现
使用方式如下:
1、引入对应maven坐标
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.0.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
2、actuator配置需要暴露的端口
management:
endpoints:
web:
exposure:
include: refresh
3、当修改配置文件中的属性后,访问actuator/refresh,请求方式问post,返回修改的属性名称,此会销毁旧的配置Bean
当属性是通过@ConfigurationProperties,不需要添加@RefreshScope注解,如果是通过@Value注解获取的属性需要添加该注解
二、pom文件profile标签的使用
profiles标签可以用来构建可选的配置;可通过profile标签配置可选配置
激活某个配置的方法:1、在运行maven命令时,通过-Pprofile名称指定如:mvn clean install -Pdev;
2、通过 一下参数激活
<activation>
<activeByDefault>true</activeByDefault>
</activation>
profile配合filters标签指定配置文件
在pom文件中使用filters属性,指定过滤的配置文件位置,其配置文件的名称和profile的名称需要一致:
<filters>
<filter>${basedir}/filters/${profiles.active}.properties</filter>
</filters>
三、在springboot项目中使用https请求
1、使用jdk的工具keytool生成证书,命令如下:
keytool -genkey -alias 密钥库别名 -keyalg RSA -keysize 2048 -keystore 秘钥库名.jks -validity 360
2、在配置文件中开启SSL验证:
server.ssl.key-store=classpath:秘钥库名.jks
server.ssl.key-store-password=生成密钥库文件时输入的密钥库密码
server.ssl.keyAlias=秘钥库名
四、将jar包与依赖的lib包进行分离
1、在pom文件中配置如下打包插件即可:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<!--重新打包,剔除其他依赖-->
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<!--项目多个启动类,需要指定,一个可省略-->
<mainClass>com.mmy.StartMain</mainClass>
<!--解决windows命令窗口下,中文乱码-->
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<!--打包类型,可忽略,类型为大写 ZIP JAR WAR-->
<layout>ZIP</layout>
<!--配置需要打包进项目的jar-->
<includes>
<include>
<groupId>nothing</groupId>
<artifactId>nothing</artifactId>
</include>
</includes>
<!--打包后的路径,当前根路径下-->
<!-- <outputDirectory>${project.artifactId}</outputDirectory>-->
<!--打包后的包名-->
<finalName>springboot-demo2</finalName>
</configuration>
</plugin>
<!--将依赖包抽出-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!--将配置文件资源单独打包到config文件夹-->
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!--指定config文件夹的位置,在当前工程下的target目录下-->
<targetPath>${project.build.directory}/config</targetPath>
<includes>
<include>**/*.properties</include>
<include>**/*.yml</include>
<include>**/*.yaml</include>
<include>**/*.xml</include>
<include>mapper/*.xml</include>
</includes>
</resource>
</resources>
</build>
2、在启动项目时指定依赖的位置,命令如下:
java -jar -Dloader.path=. lib,resources xxx.jar
五、springboot中的SPI机制
1、在META-INF目录下的spring.factories文件中配置接口的实现类名称,然后程序中读取这些配置文件中的实现类并实例化。
2、SpirngFactoriesLoader类会检索META-INF目录下的spring.factories文件,它会遍历整个Classloader中所有jar包下的spring.factories文件。
3、spring.factories文件中的配置如下示例:com.xxx.interface=com.xxx.iml.interfaceIml多个实现类用','分割
4、SpringFactoriesLoader类有两个可用方法,loadFactories()根据类接口后去类对象集合;loadFactoryNames()根据类接口获取类名称集合