目录
- 一、pom文件
- 1、常用标签
- 2、Maven 插件
- 3、不继承 parent
- 二、基本注解
- 1、@RestController 和 @Controller
- 2、@Configuration
- 3、@SpringBootApplication
- 三、自动配置
- 四、注入
- 五、开发者工具devtools
- 1、devtools作用:禁用缓存
- 2、devtools作用:自动重启
- a、排除资源
- b、添加资源
- c、禁用重启
- d、使用触发文件
- 3、devtools作用:自动刷新
- 参考链接
一、pom文件
一个简单的springboot工程的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.5.RELEASE</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1、常用标签
- <parent>:可以通过该标签继承父 pom,无需再引入父 pom 中已经引入的依赖,方便统一管理。父 pom 的 packaging 方式设置为 pom。如:上面的pom继承了 spring-boot-starter-parent,spring-boot-starter-parent 又继承了 spring-boot-dependencies。
- <dependencyManagement>:若父 pom 中的某些依赖不想被所有子 pom 引用,而是需要的时候再引用,父 pom 只管理该依赖的版本号。可将依赖配置在该标签内,子 pom 要应用时,可不用指定版本号。如:引入 spring-boot-starter-web 等时没有指定版本号,因为 spring-boot-dependencies 中已指定了版本号。若子 pom 不想使用父 pom 中某个依赖的版本,可在<properties>中覆盖该依赖的 version。
- <pluginManagement>:含义同上。
- <properties>:配置管理依赖版本号,在 dependency 中使用 ${} 方式进行应用。
- 可以在<properties>中通过<java.version>1.8</java.version>修改java版本。
- <scope>:指定 dependency 依赖的域,比如某些依赖只是在测试或者编译时需要,打包发布时不需要。<scope>的参数有: compile(默认,编译测试打包等全部过程)、 provided((表面该依赖由 JDK 或容器提供,如 Servlet 等,作用于编译和测试)、runtime((作用于运行和测试,不作用于编译,如JDBC 驱动)、test(测试)、system(与 provided 相似,但以外部 JAR 包的形式提供,maven 不会在 repository 查找它)。
- <optional>:假设在 Project-B 的 pom 中配置对 Project-C 的依赖时,optional 置为true, Project-A 依赖于 Project-B,若 Project-A 中如果没有显式的引入 Project-C,则 Project-A 不依赖 Project-C。
2、Maven 插件
spring-boot-maven-plugin 插件用于打包、管理生命周期等。该插件在 spring-boot-starter-parent 的<pluginManagement>中已经被引入,若项目 pom 以 spring-boot-starter-parent 为父 pom,则只需简单添加该插件而无需配置它,除非想改变定义在partent中的设置。简单用法示例如下:
- 自定义打包后的 jar 文件名称:通过<finalName>标签指定;
- 打包时排除某个依赖项:打包时默认会包括所有引入的依赖项,可以通过<exclude>标签排除某个不用的依赖项;
<build>
<finalName>lxw-app</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
3、不继承 parent
也可不继承任何 parent 或者继承公司标准的parent,此时,若仍旧想获取 spring-boot-dependencies 依赖管理的好处,可在<dependencyManagement>标签进行如下配置。需要注意的是,这种配置不允许在<properties>中进行依赖版本修改,若要修改某些依赖的版本,需要在 spring-boot-dependencies 前插入配置,如下所示。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>.1.1.1</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.1.BUILD-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
二、基本注解
1、@RestController 和 @Controller
@RestController=@Controller+@ResponseBody
@RestController注解的Controller方法将全部返回JSON字符串,无法返回视图。要返回视图需要@Controller和视图解析器配合。
2、@Configuration
通过该注解在 context 中注入额外的 beans,或者导入其他的配置类。
@Configuration 注解本质上还是 @Component;@Configuration 中所有带 @Bean 注解的方法都会被动态代理,因此调用这些方法返回的都是同一个实例(单例);@Configuration注解的类不可以是final类型,不可以是匿名类。
3、@SpringBootApplication
@SpringBootApplication=@EnableAutoConfiguration+@ComponentScan+@Configuration
三、自动配置
SpringBoot会根据工程中添加的依赖自动对工程进行配置。要实现自动配置的功能,需要将 @EnableAutoConfiguration 或 @SpringBootApplication 注解到 @Configuration 类上。
- 一个工程应当只有一个 @EnableAutoConfiguration 或 @SpringBootApplication 注解,建议将该注解配置在主配置类上。
- 可以通过自己的配置类来替换自动配置的某些部分,如添加自己的 DataSource bean 替换数据库的配置。
- 可以通过 debug 级别日志等方式查看自动配置详情,SpringBoot 的自动配置内容见官方网站。
- 若某些自动配置项不需要,可以使用 @EnableAutoConfiguration 注解的exclude属性禁用,如:@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
四、注入
通过 @ComponentScan 注解搜索 beans,并结合 @Autowired 构造器进行注入。
若遵循官方建议的组织代码结构(将应用主类放到包的最上层),那么你就可以添加 @ComponentScan 注解而不需要任何参数,所有应用组件(@Component, @Service, @Repository, @Controller 等)都会自动注册成 Spring Beans。
五、开发者工具devtools
SpringBoot提供了一个工具集:spring-boot-devtools,该工具集用于提升开发体验,它只作用于开发阶段,打包发布后会被自动禁用,依赖引入方式如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
1、devtools作用:禁用缓存
SpringBoot所支持的一些库有自动缓存的功能,它们利用缓存来提高性能,比如模板引擎 Thymeleaf 将缓存编译后的模板,以避免重复解析模板文件。缓存特性在生产环境很有用,但开发期间就是个累赘了,如果开发者修改了某些代码,一般会想立即看到结果。
若要禁用某些缓存,开发者需要在 application.properties 中自己进行设置(如 spring.thymeleaf.cache=false 禁用模板缓存),并且需要在打包发布时记得修改回来。而 devtools 提供了自动修改某些属性的功能,以提高开发体验。
devtools 自动修改的属性如下,详情访问官方网站。若不想使用 devtools 的属性自动修改功能,可在 application.properties 中配置 spring.devtools.add-properties=false。
spring.thymeleaf.cache=false
spring.freemarker.cache=false
spring.groovy.template.cache=false
spring.mustache.cache=false
server.servlet.session.persistent=true
spring.h2.console.enabled=true
spring.resources.cache.period=0
spring.resources.chain.cache=false
spring.template.provider.cache=false
spring.mvc.log-resolved-exception=true
server.error.include-stacktrace=ALWAYS
server.servlet.jsp.init-parameters.development=true
spring.reactor.stacktrace-mode.enabled=true
2、devtools作用:自动重启
引入 devtools 后,classpath 下的文件发生更改时会触发自动重启,而更改 classpath 的方式取决于你使用的编译器,在 Eclipse 中,保存修改的文件将更新classpath,在 IDEA 中,修改文件后 Build Project 后会更新classpath。
- devtools 的重启依赖于上下文关闭钩子,若通过 SpringApplication.setRegisterShutdownHook=false 禁用了关闭钩子,则重启功能将失效。
- 重启功能需要两个类加载器,不改变的类(如引入的第三方 jar)被加载到 base 类加载器中,经常处于开发状态的类被加载到 restart 类加载器中。当应用重启时,restart 类加载器将被丢弃,并重新创建一个新的。这种方式意味着重启机制比冷启动要快得多,因为省去 base 类加载器的处理步骤,可以直接使用。
a、排除资源
某些资源更改时不需要触发自动重启,默认不触发路径为:/META-INF/maven、/META-INF/resources、/resources、/static、/public 、/templates。若要自定义排除路径,可在配置文件中进行配置:spring.devtools.restart.exclude=static/**,public/** ,这种配置会覆盖默认路径,若想添加配置的同时保留默认配置,可使用 spring.devtools.restart.additional-exclude 属性配置。
b、添加资源
若希望某些不在 classpath 中的资源更改时触发重启,可使用 spring.devtools.restart.additional-paths 进行配合。
c、禁用重启
使用 spring.devtools.restart.enabled 属性禁用重启功能。
若要完全禁用重启支持,需要在调用 SpringApplication.run(…) 之前将 System 属性 spring.devtools.restart.enabled 设置为 false。例如:
public static void main(String[] args) {
System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(MyApp.class, args);
}
d、使用触发文件
可以自定义一个触发文件,这样不会在 classpath 中资源更新后就立即进行重启,而是触发文件修改后才会触发重启检查(注意不是触发重启,而是触发重启检查,检查 classpath 中资源是否更改再决定是否进行重启)。配置方式:spring.devtools.restart.trigger-file 属性指向触发文件的路径。
3、devtools作用:自动刷新
devtools 内嵌一个 LiveReload 服务器,它可在资源发生更改时触发浏览器刷新(需要浏览器安装对应的扩展程序)。可通过 spring.devtools.livereload.enabled 属性禁用此功能。
参考链接