Spring Boot 学习02-----Dependency以及配置等

继上一篇我们搭建了一个非常简单的Spring Boot的demo。接下来,我们将继续学习Spring Boot的相关知识。闲话少叙。
本Spring Boot的版本是2.0.0.RELEASE

Dependency Management

继承 spring-boot-starter-parent

默认是:
Java 1.8
UTF-8
Resource filtering。exec plugin、surefire、Git commit ID、shade。
如果不想使用Spring Boot中的默认版本,可以再<properties>覆盖相应的版本,如,想使用不同版本的Spring Data,具体如下:

<properties>
    <spring-data-releasetrain.version>Fowler-SR2</spring-data-releasetrain.version>
</properties>

想使用不同版本的JDK

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!-- 使用 java 1.8 -->
    <java.version>1.8</java.version>
  </properties>

pom文件

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
</parent>

不继承spring-boot-starter-parent

这种情况下,仍然可以使用dependency management,但不能使用plugin management
方式如下:

<dependencyManagement>
        <dependencies>
        <dependency>
            <!-- Import dependency management from Spring Boot -->
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

注意,socpe 是import。而且,这种情况下,不再允许<properties>覆盖相应的版本。如果要使用其他版本,需要在上面的前面添加一个完整的dependency。如下:

<dependencyManagement>
    <dependencies>
        <!-- Override Spring Data release train provided by Spring Boot -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-releasetrain</artifactId>
            <version>Fowler-SR2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>2.0.0.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

Starters

可以创建自己的Starters,但名字格式不能是spring-boot-starter-*,而是*—spring-boot-starter。类似于Maven的插件。各种starter

自动配置

@Import和@ComponentScan 类似;
@EnableAutoConfiguration 和@SpringBootAppliction 类似;注意,只能使用一次,建议用在primary @Configuration class上
注意,自动配置永远都是第二位,一旦你配置了自己的东西,那自动配置的就会被覆盖。
禁用特定的自动配置:

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;
@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

如果class不在classpath 中,可以使用excludeName,然后使用全路径即可。

Spring Beans和依赖注入

@SpringBootApplication等同于默认属性的
@Configuration, @EnableAutoConfiguration and @ComponentScan。
– 注意,@ComponentScan 不能凭空使用。
@Service 用在业务层
@Controller 用在Controller层(控制层)
@Repository 用在数据层
@Autowired 用于注入bean

运行fat jar(executable jar)

java -jar target/xxx.jar

启动远程调试支持

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myapplication-0.0.1-SNAPSHOT.jar

使用Maven Plugin

mvn spring-boot:run

设置系统的环境值

export MAVEN_OPTS=-Xmx1024m

热加载

因为Spring Boot应用都是简单的Java应用,所以JVM Hot-swapping 可以直接使用,但是,JVM Hot-swapping 对于能够替换的字节码有些限制,所以建议使用JRebel 或者Spring Loaded
spring-boot-devtools 模块同样包含了快速重启应用的支持,但是只能在debug期间修改方法体。

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

注意,生产环境下(java -jar 或者通过特定的类加载器启动),这些开发工具则自动被禁止。
上面的<optional>true</optional> 可以有效阻止用于其他模块。如果你想确保生产Build中不包含devtools,可以使用excludeDevtools build property。

Property defaults

一些Spring Boot 支持的库使用了caches 增强性能。例如, template engines。但是cache,在开发过程中可能会是一个阻碍,例如你无法立即更新一个模块(thymeleaf的)。cache 设置通常在application.properties中。但是,比起手动设置这些,spring-boot-devtools模块会自动应用这些开发期的设置。

自动重启

使用spring-boot-devtools模块的应用,当classpath中的文件有改变时,会自动重启!—就是说,默认会监视classpath入口。
静态资源和视图模板不需要重启!
注意,不同的IDE有不同的表现,例如Eclipse中只要改变了文件并保存,那么就会导致classpath中的内容改变,而IDEA则需要Build -> Make Project
可以通过 build plugin 启动应用,只要开启了forking支持,因为Devtools需要一个隔离的classloader才能运行正常。Maven下要这样开启:

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
            </configuration>
        </plugin>
    </plugins>
</build>

注意:在使用LiveReload(热加载)时,自动重启仍然可以正常工作。如果你使用了JRebel,自动重启会被禁用以支持动态类加载。此时,devtools其他方面仍然可以使用。
注意:DevTools在重启过程中依赖应用上下文的shutdown hook来关掉它,所以如果禁用了shutdown hook,他就无法正常工作了。

SpringApplication.setRegisterShutdownHook(false)

Spring Boot使用的重启技术,实际上是使用了两个类加载器:不变的base类加载器,可变的restart 类加载器。前者加载第三方jar之类的。后者加载项目代码。重启的时候,只是丢弃可变的restart 类加载器,然后重新创建一个。所以速度比较快。
如果你还是觉得不够快,你可以考虑使用JRebel

一些特定的资源改变时没有必要引起重启。有一些不会引起重启,但是会重加载。如果你想自定义的设置一下,可以使用spring.devtools.restart.exclude 属性,例如,要排除/static以及/public,你可以设置如下属性。

spring.devtools.restart.exclude=static/**,public/**

如果你想在修改classpath之外的文件时也让应用重启,可以使用spring.devtools.restart.additional-paths 属性。还可以配合上面提到的spring.devtools.restart.exclude 属性,来控制是重启还是重加载。

如果不想使用自动重启功能,可以使用spring.devtools.restart.enabled 属性。多数情况下,可以再application.properties中设置,这样仍然会创建一个restart类加载器。但不在监视改变。
如果想完全禁止自动重启,需要在调用SpringApplication.run(..) 之前设置一个System属性。如下:

public static void main(String[] args) {
    System.setProperty("spring.devtools.restart.enabled", "false");
    SpringApplication.run(MyApp.class, args);
}

如果你的IDE可以随改随编译,你可能会倾向于只在特定时刻引发重启,这时,你可以使用trigger file ,就是一个特定的文件。只有修改了这个文件才会触发重启,使用spring.devtools.restart.trigger-file 属性即可。

自定义restart类加载器。
如果有一个多模块项目,只有部分导入到你的IDE中,你可能需要自定义一下。首先创建一个文件:META-INF/spring-devtools.properties。该文件中,可以有以前缀 restart.exclude. 和 restart.include. 开头的属性。前者会被放入base类加载器,后者则被放入restart类加载器。
该属性的value,是正则表达式。例如:

restart.include.companycommonlibs=/mycorp-common-[\\w-]+\.jar
restart.include.projectcommon=/mycorp-myproj-[\\w-]+\.jar

已知限制

自动重启,在使用 ObjectInputStream反序列化时,会出现问题。如果你需要反序列化数据时,你或许需要使用Spring的ConfigurableObjectStream配合Thread.currentThread().getContextClassLoader()使用。
可惜,一些第三方的jar没有考虑到这个问题。无解。

热加载LiveReload

spring-boot-devtools 模块内置了一个liveReload Server,可以保证在改变资源时浏览的刷新。LiveReload 的浏览器扩展,免费支持Chrome,Firefox以及Safari。
如果你想禁用 LiveReload server,你可以设置spring.devtools.livereload.enabled 属性为false。
注意:只能运行一个LiveReload Server。如果同时开启多个项目,那只有第一个。

引用

https://www.cnblogs.com/larryzeal/p/5799195.html#c4-3
https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/reference/htmlsingle/#getting-started-first-application-executable-jar


作者:码农飞哥

微信公众号:码农飞哥