SpringBoot 学习笔记(一)——pom文件、基本注释、自动配置、注入、开发者工具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 属性禁用此功能。


参考链接

SpringBoot 官方说明文档

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值