spring boot

一 介绍

通过Spring Boot,能够快速的创建独立的、生产级的、基于spring的应用。spring boot整合了spring平台和三方库,通starter依赖与自动配置功能,极大的减少了配置的需要,甚至不需要配置。spring boot与框架整合的过程中也提供了配置的接口,如通过application.propertiesapplication.yml来配置整合的框架。如果还是不满意,那只能单独为该框架写配置文件了。

总之,spring boot整合了spring框架和三分库,提供自动配置,并将框架的常用配置集中在单独的配置文件中(相当于配置文件的一层简单的封装),达到了快速开发的目的。

二 入门

首先通过Spring Initializr初始化项目(在IDEA中操作比较合适),会看到所有的starter依赖,这是spring boot整合后形成的依赖,几乎涵盖了软件整个生命周期所需的所有依赖。选择Web。

将产生的目录结构中的.mvn,HELP.md,mvnw,mvnw.cmd等文件或目录删除。

2.1 pom.xml

spring boot应用可以直接打包成jar,如有starter-web依赖,还会嵌入tomcat容器,可直接在命令行上启动web该程序,提供web服务。在pom.xml文件中,我们几乎不必设置版本号,由spring boot管理。等等之类的功能,可以在pom.xml文件中得到解释,默认提供的内容如下所示:

  • parent元素指定要继承配置的父pom文件spring-boot-starter-parent,含有spring boot的默认配置,如:
    • 默认JDK1.8
    • maven默认构建、输出使用UTF-8
    • spring-boot-dependencies作为父pom文件,含有spring boot配置的所有依赖的版本号。通过该依赖,在自己的pom中,我们几乎不必设置版本号,当然也可以手动覆盖它。
  • 属性java.version指定JDK版本,这是spring boot设置独有的方式。
  • 已选中的依赖,如web,和默认提供的test依赖。此时这些依赖我们不用设置版本号。
  • Starters:starter是spring boot整合后,用于描述一系列相关依赖的集合。如已提供的web、test依赖,包含web开发所需的依赖,并且内嵌tomcat。
    • 命名方式: spring-boot-starter-**表示某一类应用。
    • 官方支持starter;社区支持的starters
  • 插件spring-boot-maven-plugin的功能:
    • 自动搜索含有main方法,标记为可执行的class
    • 将环境变量下的所有jars打包成一个可运行的jar
    • 内置依赖解析器,自动设置依赖版本号与spring boot依赖一致。可以自行覆盖
    • 使用mvn package打包时,spring boot会执行repackge的过程(一些开发需要的jar会被排除)但repackage之前生成的jar仍会被提供。

2.2 自动配置

spring boot会根据classpath中jar或你已配置的Bean,然后自动配置和生成相关的Bean到spring容器中。具体配置什么Bean,spring boot已经默认设置了,基本上你不必手动配置。如果你已经配置了Bean,spring boot则不会配置该bean,让你通过一点点努力而得到更多的控制权。

使用了习惯大于配置的原则,通常自动配置的都是自己想要的

如果一些自动配置的类不是自己想要的,可在注解上指定exclude属性。

2.3 运行入口

静态方法SpringApplication.run通过一个配置类,会创建一个应用容器,这是spring boot程序的入口。

@SpringBootApplication标注的类为配置类,实际上主要是三个注解的组合:

  • @Configuration:标注该类是用于Bean定义的配置类
  • @EnableAutoConfiguration:开启自动配置,详细见2.2。
  • @ComponentScan:Bean扫描,会扫描该配置类所在的包和子包。

常见的组合是,@SpringBootApplication注解的配置类中定义主函数作为入口,并执行SpringApplication.run,如:

@SpringBootApplication
public class SpringBootHelloworldApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootHelloworldApplication.class, args);
    }
}

2.4 目录结构

目录结构和平常使用的一样,可分层或分模块来组织代码:

  • 分层
    在这里插入图片描述

  • 分模块
    在这里插入图片描述

其中:

  • 主类所在的包和子包都会被spring boot扫描。
  • static:包含静态资源文件,在web项目中,则存放可访问的前端代码
  • templates:也是存放静态资源文件,在使用视图模板的web项目中存入模板文件。
  • application.properties:spring boot项目的配置文件,被spring boot所支持的库都可以在这里进行配置。

注意点:

  • spring boot入口类一定要放在包下,否则会导致扫描所有jar包。而是放在项目的root package下。
  • 想要引入其他配置文件,无论xml、java代码配置,使用@Import就行了,spring ioc的内容。

2.5 测试

默认已经提供了test依赖(使用Junit),和一个测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootHelloworldApplicationTests {
    @Autowired
    HelloController controller;

    @Test
    public void contextLoads() {
        System.out.println(controller.index());
    }
}
  • @RunWith(SpringRunner.class):启动spring测试容器,因此可以使用注解注入Bean。
  • @SpringBootTest:在基于spring测试容器之上,提供过多的特性。看不懂都是些啥子特性。
  • @Test:标注要测试的方法,和Junit一样。

三 深入

3.1 devtools

spring boot提供了devtools,为开发带来一点方便。需要加入依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional>
</dependency>
  • 在repackage的过程中,devtools默认不会被打包进来。
  • 当运行为一个完整的jar时,devtools的功能会自动被禁用。因此应该使用IDE运行,或者mvn spring-boot:run

devtools的功能

  • 默认关闭缓存:如spring mvc中,防止你不能立马看到改变后的效果。

  • 自动重启(restart):程序运行时,当classpath下文件改变会造成项目重启,IDE能够很方便的触发重启。注意,静态资源(位于/resources, /static, /public, or /templates等等)的更改不会触发程序重启,但确实已被重载(reload)了。

    • Eclipse中,文件保存便会触发重启
    • IDEA中,需要点击Build->Build Project,快捷键Ctrl+F9

    spring boot的重启实际上是要比完全重启项目(cold restart)要快些的。

    原理:spring boot使用两个类加载器来完成这些功能:base类加载器加载三方jar包,restart加载器负责加载当前开发项目的类,程序重启时,仅丢弃restart加载器加载的类并重新加载。但此方案可能会造成类加载器问题,此时需要关闭重启功能!!

    如果还不爽,可考虑JRebel,它会重载(reload)的类。至于LiveReload或JVM hot swap,支持不够好也不好用。

个人使用起来,感觉和JVM的热更新没啥区别,修改方法名、参数啥的照样要重新运行程序

3.1.1 与idea intellij

idea对devtools提供了支持,当存在spring-boot-devtools模块时,可以使用它的update功能。如下所示:

实际上,经测试,devtools存不存在,update功能都能使用。

在这里插入图片描述
如上配置后,每次切换程序,会自动更新静态文件,点击update按钮,触发devtools的restart。update按钮的快捷键:Ctrl+F10

参考:

3.2 其他

  • JVM热更新:spring boot程序(被打包成jar)只是一个普通的java程序,因此可以使用Jvm热更新功能。但有一定限制,完整的解决方案得用JRebel
  • 尽管IDE中运行的结果与mvn package不同,但IDE也执行了maven的部分生命周期吧?如compile
  • SpringApplication类是启动spring应用程序的一个方便的入口。它会启动一个应用容器(ApplicationContext),应用容器有很多种,产生哪种取决于classpath下的jar包。

3.3 spring boot配置

spring boot整合了spring框架和三方库后,提供了自动配置的功能,它的默认配置通常是我们需要的。spring boot也整合了他们的配置,允许我们使用spring boot的配置文件来配置他们。

  • spring boot配置的途径有很多,常用的配置方式有:properties文件、YAML文件、环境变量、命令行参数,这些配置最终会存入Environment?。同名属性覆盖顺序参考:Externalized Configuration,这种属性覆盖的方式,是的你能够轻松的从开发环境下切换到生产环境。

  • 获取属性值的两种方式:

    • @Value:将属性绑定到类的字段上,配合SpEL表达式使用。
    • @ConfigurationProperties:将一组属性绑定到类上。
    • 这两个玩意,复杂的呀~~皮!
  • 一般使用配置文件application.properties,application.yml

  • 属性可用随机数,如:

    my.secret=${random.value}
    my.number=${random.int}
    my.bignumber=${random.long}
    my.uuid=${random.uuid}
    my.number.less.than.ten=${random.int(10)}
    my.number.in.range=${random.int[1024,65536]}
    
  • 占位符:当属性被使用时,会在Environment中处理一下,因此属性中可使用占位符:

    app.name=MyApp
    app.description=${app.name} is a Spring Boot application
    
  • 通用配置:这使用spring boot依赖或配置三方库时需要的大部分配置属性。也能存在其他的属性配置,这取决于引入的依赖是否从spring boot环境中取出值来。

3.3.1 YAML与properties

书写配置属性的两种方式,@Value也能获取yaml文件的属性。貌似yaml属性值前需要一个空格,文件后缀yml。

  • 简单属性:

    • yaml:

      url: http://dev.example.com
      name: Developer Setup
      
    • properties:

      url= http://dev.example.com
      name= Developer Setup
      
  • 对象属性:

    • yaml:

      environments:
      	dev:
      		url: http://dev.example.com
      		name: Developer Setup
      	prod:
      		url: http://another.example.com
      		name: My Cool App
      
    • properties:

      environments.dev.url=http://dev.example.com
      environments.dev.name=Developer Setup
      environments.prod.url=http://another.example.com
      environments.prod.name=My Cool App
      
  • 数组属性:

    • yaml:

      my:
          servers:
              - dev.example.com
              - another.example.com
      
    • properties:

      my.servers[0]=dev.example.com
      my.servers[1]=another.example.com
      

一个例子,获取上面的数组属性:

@Component
@ConfigurationProperties(prefix="my")
public class Config {

	private List<String> servers = new ArrayList<String>();

	public List<String> getServers() {
		return this.servers;
	}
}

或者

@Component
public class Hello {
    @Value("${my.servers[0]}")
    String server1;
    @Value("${my.servers[1]}")
    String server2;
}

四 Logging

spring boot对Java Util LoggingLog4J2Logback提供了支持与默认配置。当在classpath下发现日记jar包时,会自动配置这些jar包,并且对于spring boot支持的日记系统,都可以通过应用属性进行配置,即logging属性是独立于日记系统的

在spring boot框架内部,使用Commons Logging做内部使用的接口,而接口实现不强制规定。但由于spring boot使用的日记是在ApplicationContext创建之前初始化的,因此只能通过系统属性来修改spring boot使用的日记系统。并且,starter系的jar包默认使用Logback作为日结实现使用。替换麻烦,但spring boot提供恰当的路由,保证其他使用不同日记系统的依赖能够正常工作

因此,自己的项目使用其他框架时不必关心spring boot内部使用的框架,并且应用属性的配置是可以同时作用到所支持的日记系统的!

我见有些人通过排除掉spring-boot-starter-logging(目的是去除Logback)的日记包来强制spring boot框架本身使用其他日记系统。但应该没必要吧,并且文档都强调了这点,如:

There are a lot of logging frameworks available for Java. Do not worry if the above list seems confusing. Generally, you do not need to change your logging dependencies and the Spring Boot defaults work just fine.

补充:spring boot对Logback的支持度和耦合度高得多!!!不爽

4.1 使用log4j2

添加jar包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

类中获取Logger

public class Hello{
    static final Logger LOGGER= LogManager.getLogger();
}

注意,类要引入和log4j相关的包,别引入错了。否则如果用的是Common Logging的接口,那么会导致不如意的使用了Logback,如果将Logback的jar排除掉,那么最终使用的就是log4j2了(被桥接了)。

至于配置文件呢?见下面。

4.2 配置

4.2.1默认配置

之前说了,spring boot提供了默认配置,统一所支持日记系统的默认行为,即:

  • 相同的Log格式,并带有颜色的。
  • 日记级别默认为info
  • 输出到console。
  • 等等

4.2.2 通用配置

spring boot也提供了常用的应用属性配置,并且这些属性是日记系统独立的:

  • debug:true则设置日记级别为debug

  • trace:true则设置日记级别为trace

  • logging.level.*:为具体的某个包设置日记级别,如:

    logging.level.root=WARN
    logging.level.org.springframework.web=DEBUG
    logging.level.org.hibernate=ERROR
    
  • logging.group.*:聚集多个包为组,便于配置为同一个日记级别。如:

    logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat
    logging.level.tomcat=TRACE
    

    spring boot默认提供的有:

    NameLoggers
    weborg.springframework.core.codec, org.springframework.http, org.springframework.web
    sqlorg.springframework.jdbc.core, org.hibernate.SQL
  • 文件相关的属性:不好意思。。仅支持Logback。。不写了

4.2.3 自定义配置

文件相关的属性,仅支持Logback,但是我们可以通过自定义日记系统自己的配置文件来支持这些属性。

通过属性logging.config属性指定,根据你的日记系统,不同的文件会被加载:

Logging SystemCustomization
Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, or logback.groovy
Log4j2log4j2-spring.xml or log4j2.xml
JDK (Java Util Logging)logging.properties

配置文件名最好加上-spring。因为标准日记名也能被日记系统识别,如果日记系统比spring 容器先初始化,那么spring boot就不能很好的控制日记系统初始化了。

为了支持更好的扩展,spring boot将一一些Environment中的属性转移到了系统属性中,并且上述日记系统都支持从系统属性中获得属性。

具体的不说了,本小白用不到。但注意的是,如果在日记配置文件的属性中使用占位符,因为使用spring boot的语法。Logback的配置文件还支持直接从应用属性中获取值。。。

详细参考:Custom Log Configuration

五 spring mvc

需要引入starter-web依赖,然后会自动配置spring mvc所有的组件,并且加入了嵌入式tomcat,可直接打包成jar并运行。

  • RestController@ResponseBody@Controller的结合,声明为控制器且使用对象作为返回值(默认使用Jackson转化为json数据)。
  • @RequestMapping:将方法映射到某个http请求。可使用它的变种,如@GetMapping,@PostMapping等等。

5.1 自动配置

  • Inclusion of ContentNegotiatingViewResolver and BeanNameViewResolver beans.
  • Support for serving static resources, including support for WebJars
  • Automatic registration of Converter, GenericConverter, and Formatter beans.
  • Support for HttpMessageConverters
  • Automatic registration of MessageCodesResolver
  • Static index.html support.
  • Custom Favicon support
  • Automatic use of a ConfigurableWebBindingInitializer bean

5.2 HttpMessageConverters

HttpMessageConverter 用于转化HTTP请求或响应。默认对象会被转化为JSON或XML(如果存在Jackson xml),至于什么时候转化为什么类型,见spring mvc-Content Types。字符编码默认使用UTF-8

自定义HttpMessageConverters ,添加更多HttpMessageConverter

@Configuration
public class MyConfiguration {

	@Bean
	public HttpMessageConverters customConverters() {
		HttpMessageConverter<?> additional = ...
		HttpMessageConverter<?> another = ...
		return new HttpMessageConverters(additional, another);
	}

}

这应该是添加新的converter吧。。

5.3 JSON Serializers and Deserializers

对象序列化或解序列化时,使用的是Jackson的serializers或Deserializers,如果对象本身或对象的一个字段很复杂时,需要自定义serializer或deserializer,并在Jackson中注册。

略。。

参考:

5.4 静态内容

看不懂。。。。

  • spring.resources.static-locations属性定义静态内容位置
  • spring.mvc.static-path-pattern:静态资源匹配模式。静态内容位置中匹配成功的才作为静态资源
  • 只有静态内容位置的根目录才能使用欢迎页面。
  • DispatcherServlet未能处理http请求时,会交给tomcat容器的默认servlet处理

5.5 Path Matching and Content Negotiation

  • 默认禁止后缀匹配
  • 主要通过请求的Accept字段来返回相应MIME类型的响应。

5.6 CORS支持

通过@CrossOrigin 可以对方法或类进行局部配置,而通过注册WebMvcConfigurer 可以进行全局配置,如:

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**")
            .allowCredentials(true);
        }
    };
}

CorsRegistry的默认行为:

  • Allow all origins.
  • Allow “simple” methods GET, HEAD and POST.
  • Allow all headers.
  • Set max age to 1800 seconds (30 minutes).

它默认允许所有源访问,却不通过*实现的,而是通过设置为http请求的Origin字段(请求源域名)实现的。因此不会与allowCredentials冲突。

六 mybatis

6.1 使用

maven中加入依赖:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.1</version>
</dependency>

该依赖也加入了spring boot自动配置的功能:

  • 从spring容器中自动检测已存在的DataSource
  • SqlSessionFactoryBean中传入DataSource ,生成SqlSessionFactory
  • SqlSessionFactory中获得SqlSessionTemplate
  • 自动扫描mapper,连接到SqlSessionTemplate 上,并注入到spring容器中.

mybatis会引入starter-jdbc,而starter-jdbc又引入数据源HikariCP,因此只需要再添加mysql依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

默认扫描含@Mapper注解的接口,如:

@Mapper
public interface UserDao {
    @Select("select * " +
            "from user " +
            "where id=#{id}")
    public User selectById(int id);
}

也可以在配置类上用注解@MapperScan将某个包的接口全部注册,如@MapperScan("com.example.demo2.dao")

在自动装配mapper时,idea报错说容器中无mapper,可禁止检查:

Settings - Editor - Inspections - Spring - Spring Core - Code - Autowiring for Bean Class - disable

6.2 配置

mybatis与spring boot整合后,也可以在spring boot的配置文件中配置mybatis。部分属性如下:

  • mapper-locations:Mapper xml

  • type-aliases-package:类型匿名所在位置

  • configuration:传给ConfigurationBean的属性配置,见 MyBatis reference page

mybatis基本不用配置什么,基本配置数据源就够了,如:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
    username: root
    password: 123456
    
mybatis:
  type-aliases-package: com.example.demo2.entity

mybatis注册mapper接口时,也会检测同包下是否存在对应xml文件,如果需要,还需配置maven,见maven之允许src目录下xml文件输出到target目录

参考:

七 其他

7.1 JSON

spring boot支持三种JSON映射库的集成:

  • Gson
  • Jackson:默认使用的库
  • JSON-B

spring-boot-starter-json提供Jackson,会自动生成ObjectMapper Bean。spring-boot-starter-web中,默认引入了该包。

7.2 嵌入servlet容器支持

  • 支持嵌入式tomcat、Jetty和Undertow。
  • 网络配置:
    • server.port:监听端口号,默认8080
    • server.address:绑定地址
    • server.servlet.context-path:配置content-path,即访问url的前缀。

参考

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值