libai8723 / front-end-dev-notes-bignerdbook

Github Pages
https://libai8723.github.io/front-end-dev-notes-bignerdbook/
1 stars 0 forks source link

Miscellaneous Weekly 2022-08-12 #56

Open libai8723 opened 2 years ago

libai8723 commented 2 years ago

需要学习一下Spring Cloud Gateway

1. Bootstrapping

In computing, the term bootstrap means to boot or to load a program into a computer using a much smaller initial program to load in the desired program, which is usually an OS

https://www.techtarget.com/whatis/definition/bootstrap https://en.wikipedia.org/wiki/Bootstrapping

所以从上面的句子来看讲的很明白了,中文翻译叫做引导。使用一个小型的程序,把想要使用的目标的、大型的程序加载进来,并且运行起来。其实wiki上还有来源,不做考究了。

2. SpringBoot的应用如果同时存在application.properties文件和application.yml文件会怎么样?

https://stackoverflow.com/questions/25231918/does-spring-boot-support-using-both-properties-and-yml-files-at-the-same-time

按照这里的说法,优先加载 .yml文件中的配置,然后加载 .properties中的配置。如果还有application-profile.properties文件的话,最后被加载。后加载的属性值会复杂先加载的。

3. Maven的几个神奇的元素:modules, parent, properties, import

为了效率,看的是中文的:https://www.cnblogs.com/youzhibing/p/5427130.html

3.1 modules

如果我们的项目分成了好几个模块,那么我们构建的时候是不是有几个模块就需要构建几次了(到每个模块的目录下执行 mvn 命令)。当然,逐一去敲命令还是挺爽的,但是简单的做法就是使用聚合,一次构建全部模块。就用到Module这个元素了

首先是建一个聚合的Maven项目吧,注意packaging模式是pom

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.youzhibing.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Account Aggrregator</name>
  <url>http://maven.apache.org</url>

  <modules>
    <!-- 模块都写在此处 -->
      <module>account-register</module>
      <module>account-persist</module>
  </modules>

</project>

然后作者又在这里创建了2个子模块 account-register、account-persist,都是在eclipse里面创建的,有详细描述,就是右键点击之后,创建maven module

下面是eclipse自动为子module创建的目录结构和pom文件如下:

pom文件示意图

可以看到里面自动加了 parent这个东西。作者说比较讨厌,那就比较讨厌吧,先往下看。

3.2 parent元素

作者说,这一点和java中的继承是一样的,就是子module会继承父module的东西,比如父module声明了依赖的话,那么子module就自动都有这个依赖了。可以用来配置大家都需要的依赖:

还给了例子,下面是parent的pom

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.youzhibing.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Account Aggrregator</name>
  <url>http://maven.apache.org</url>

  <modules>
      <!-- 模块都写在此处 -->
      <module>account-register</module>
      <module>account-persist</module>
  </modules>

  <dependencies> <!-- 配置共有依赖 -->
      <!-- spring 依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>

...

</project>

下面是account-register和account-persist的2个pom,都配置各自的依赖就行了,parent里面配置的东西,不要重新写了:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.youzhibing.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath> <!-- 与不配置一样,默认就是寻找上级目录下得pom.xml -->
  </parent>
  <artifactId>account-register</artifactId>
  <name>account-register</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>    <!-- 配置自己独有依赖 -->
      <dependency>
          <groupId>javax.mail</groupId>
          <artifactId>mail</artifactId>
          <version>1.4.3</version>
      </dependency>
    <dependency>
      <groupId>com.icegreen</groupId>
      <artifactId>greenmail</artifactId>
      <version>1.4.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

下面是account-persist的配置:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.youzhibing.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <artifactId>account-persist</artifactId>
  <name>account-persist</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>    <!-- 配置自己独有依赖 -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.16</version>
    </dependency>
  </dependencies>
</project>

看起来非常合理。register里面配置了自己依赖于mail的东西,persist里面配置了自己依赖jdbc和druid连接池。

然后继续说一下dependencyManagement 的元素,上面的方式大包大揽的,把所有需要的依赖,都放在parent的依赖中了,不管子module是否需要,都会引入,万一不需要呢?

libai8723 commented 2 years ago

3.3 接着写 dependencyManagement 元素

这个东西人如其名,就是提供依赖管理的,在parent里面写依赖管理,不会实际在子module中引入依赖,需要子元素自己显式的声明自己需要这个东西,举个例子:

parent pom这么写:

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.youzhibing.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Account Aggrregator</name>
  <url>http://maven.apache.org</url>

  <modules>
      <!-- 模块都写在此处 -->
      <module>account-register</module>
      <module>account-persist</module>
  </modules>

  <dependencyManagement>
      <dependencies> <!-- 配置共有依赖 -->
      <!-- spring 依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>

      <!-- junit 依赖 -->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.7</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
  </dependencyManagement>
</project>

然后子module必须要下面的写法:

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.youzhibing.account</groupId>
    <artifactId>account-aggregator</artifactId>
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <artifactId>account-persist</artifactId>
  <name>account-persist</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
      <!-- spring 依赖 -->
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-beans</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
    </dependency>

      <!-- junit 依赖 -->
      <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.0.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>1.0.16</version>
    </dependency>
  </dependencies>
</project>

其实没少写多少东西,但是依赖的版本号,不需要写了,大家统一了。

import元素

作者写的非常精髓,直接抄过来:

import 只在 dependencyManagement 元素下才有效果,作用是将目标 pom.xml (也就是account-aggregator的pom文件)中的 dependencyManagement 配置导入并合并到当前 pom.xml 的 dependencyManagement 元素中

  如下就是将 account-aggregator中 的 dependencyManagement 配置导入并合并到当前 pom.xml 中

下面是应该是写在account-register的pom里面的:

<dependencyManagement>
      <dependencies>
        <dependency>
            <groupId>com.youzhibing.account</groupId>
              <artifactId>account-aggregator</artifactId>
              <version>1.0.0-SNAPSHOT</version>
            <type>pom</type>
              <scope>import</scope>
        </dependency>
      </dependencies>
  </dependencyManagement>
libai8723 commented 2 years ago

properties 元素

作者写的非常好,抄:

通过 properties 元素用户可以自定义一个或多个 maven 属性,然后在 pom.xml 的其他地方使用 ${属性名} 的方式引用该属性,这种做法的最大意义在于消除重复和统一管理。 maven 总共有 6 类属性,内置属性、POM属性、自定义属性、Settings属性、java系统属性和环境变量属性。

下面是举例子:

1. 内置属性:

${basedir} 表示项目根目录,即包含 pom.xml 文件的目录;${version} 表示项目版本

2. pom 属性 比如: 用户可以使用该类属性引用POM文件中对应元素的值。如${project.artifactId}就对应了 元素的值,常用的POM属性包括:

    ${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/

    ${project.build.testSourceDirectory}:项目的测试源码目录,默认为src/test/java/

    ${project.build.directory} : 项目构建输出目录,默认为target/

    ${project.outputDirectory} : 项目主代码编译输出目录,默认为target/classes/

    ${project.testOutputDirectory}:项目测试主代码输出目录,默认为target/testclasses/

    ${project.groupId}:项目的groupId

    ${project.artifactId}:项目的artifactId

    ${project.version}:项目的version,与${version} 等价

    ${project.build.finalName}:项目打包输出文件的名称,默认为${project.artifactId}-${project.version}

3. 自定义属性

spring boot的父的父pom中就大量的使用了这种东西,比如下面就是

  <properties>
      <!-- 定义 spring版本号 -->
    <spring.version>4.0.2.RELEASE</spring.version>
    <junit.version>4.7</junit.version>
  </properties>

4. settings属性

直接去取maven的settings.xml文件里面的属性。。。好厉害

5. java的属性 据说就是 Java系统属性:可通过java.lang.System.getProperties()访问的所有属性都可用作POM属性,如${java.home}。

能打印出很多好玩的东西

    public static void main(String[] args) {
        Properties pers = System.getProperties();

        pers.forEach((k,v)->{
            System.out.println(k +":" +v);
        });
    }

6. 最后是环境

所有环境变量属性都可以使用以 env. 开头的 maven 属性引用,如 ${env.JAVA_HOME} 指代了 JAVA_HOME 环境变量的的值

非常有趣,好像懂了。在windows下面,可以在cmd下面使用set命令来显示所有的环境变量