spring使用技巧二

102 阅读2分钟

一、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()根据类接口获取类名称集合