3 Spring Boot 2.x系列--使用细节

本次对Spring Boot的运行细节进一步介绍。

一 Build Systems(构建系统)

Spring Boot官方文档中建议可以使用发布到Maven central的库的开发平台。

事实上,Spring Boot官方文档中指出使用MavenGradle两种方式作为构建系统都是适配的。

个人理解,MavenGradle是两种根据用户自定义的文件自动从中央仓库下载所需文件的工具

1.1 依赖关系管理

Spring Boot的每一个版本都提供了它支持的依赖项列表,实际上,在我们的maven配置文件中,并不需要给定这些依赖项的版本号,因为Spring Boot会为我们自动指定这些依赖项的版本,所以我们只需要给定Spring Boot的版本就好了,当然,你也是可以为依赖项指定版本号的,这会覆盖掉Spring Boot的推荐版本。

依赖项列表中包含了Spring Boot用到的Spring模块,官方文档中指出不建议更改推荐的版本。

Each release of Spring Boot is associated with a base version of the Spring Framework. We highly recommend that you not specify its version.

1.2 maven

在使用Maven作为构建系统时,我们通过继承spring-boot-starter-parent项目获得默认工具包,这个父项目包括几个特点:

  • 默认为Java 1.8
  • 编码为UTF-8
  • 无须指定依赖项的版本
  • 合理的资源过滤
  • 合理的插件配置
  • 合理的资源过滤,(application.properties||application.yml)

1.2.1 继承starter parent

maven中,首先定义parent为:

<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.3.BUILD-SNAPSHOT</version>
</parent>

如果你不想使用Spring Boot所推荐的依赖项版本,你可以在pom.xml中定义:

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

1.2.2 不想使用parent?

一些用户不想从spring-boot-starter-parent继承以获得Spring Boot支持。也可以这样引入:

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

这样做的好处是可以使用scope=import实现清晰管理。

据我理解,在maven中使用scope=import的流程是:首先在一个父pom.xml中定义所有需要的依赖,然后在子pom.xml中获得所需要的依赖,这样做使得结构十分清晰。这也使得在Spring Boot中无须继承父类starters也可获得Spring Boot支持。

如果你不想使用Spring Boot所推荐的依赖项版本,你可以在pom.xml中定义:

<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.2.3.BUILD-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

1.2.3 Spring Boot Maven Plugin使用

Spring Boot提供了打包插件,可以在pom.xml中这样定义:

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

1.3 Starters

Starters是在应用程序中定义的依赖关系描述符。在项目中,只需要把Starters引入进来,你就可以开始做项目了。例如,如果想要使用SpringJPA进行数据库访问,在项目中包含Spring -boot-starter-data- JPA依赖项即可。

Starters中包含使程序运行起来的很多依赖项。

**命名:**官方的Starters命名类似,为spring-boot-starter-*,第三方Starters不能以spring-boot开头,常以项目的名称开始。

二 Structuring Your Code(代码组织)

Spring Boot没有特定的代码规范标准,下面是一些建议。

2.1 default Package的使用

如果一个类中没有声明package,则被认为存在于default package之中,Spring Boot官方文档中指出这种类不应该存在,也可能会导致一些问题。

We recommend that you follow Java’s recommended package naming conventions and use a reversed domain name (for example, com.example.project).

2.2 主程序类位置

建议将主程序类放在root package之中,在其它类之上。注解@SpringBootApplication常用于主程序类之中。

If you don’t want to use @SpringBootApplication, the @EnableAutoConfiguration and @ComponentScan annotations that it imports defines that behaviour so you can also use those instead.

一个常用的layout如下:

com
 +- example
     +- myapplication
         +- Application.java
         |
         +- customer
         |   +- Customer.java
         |   +- CustomerController.java
         |   +- CustomerService.java
         |   +- CustomerRepository.java
         |
         +- order
             +- Order.java
             +- OrderController.java
             +- OrderService.java
             +- OrderRepository.java

其中main方法在Application.java中声明(包含@SpringBootApplication注解),就像下面这段代码一样:

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

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

}

三 Configuration Classes(配置类)

Spring Boot支持基于Java的配置手段。尽管它也支持基于XML文件的配置手段,但Spring Boot官方文档指出更推荐使用@Configuration使Java类成为一个主要源(也就是定义了main方法的类)。

不需要将@Configuration放到所有类中。@Import注解可用于导入其他配置类。或者,也可以使用@ComponentScan注解来自动获取所有Spring组件。

如果仍想要使用基于XML的配置,建议从@Configuration类开始。然后使用@ImportResource注解来加载XML配置文件。

四 Auto-configuration(自动配置)

Spring Boot可以根据所引入的依赖包对Spring Application进行自动的配置。

添加@EnableAutoConfiguration或者@SpringBootApplication注解可以启动自动配置。

You should only ever add one @SpringBootApplication or @EnableAutoConfiguration annotation. We generally recommend that you add one or the other to your primary @Configuration class only.

自动配置是非侵入性的,这意味着更改或取消某个自动配置是很容易的。

五 Spring Beans and Dependency injection

关于Spring Beans和Dependency的注入问题,常使用@ComponentScan@Autowired实现。

如果按照上面的建议组织代码(将应用程序类定位在root package中),则可以添加@ComponentScan而不需要任何参数。所有应用程序组件(@Component@Service@Repository@Controller等)都将自动注册为Spring bean

@Service@Controller@Repository@Component
业务层组件控制层组件数据访问层组件泛指组件

举个例子:

package com.example.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class DatabaseAccountService implements AccountService {

    private final RiskAssessor riskAssessor;

    @Autowired
    public DatabaseAccountService(RiskAssessor riskAssessor) {
        this.riskAssessor = riskAssessor;
    }

    // ...

}

六 @SpringBootApplication注解的使用

简单地说:

@SpringBootApplication实现了@EnableAutoConfiguration@ComponentScan@Configuration的功能。

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {

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

}

七 运行程序

将应用程序打包为jar并使用嵌入式HTTP服务器的最大优点之一是可以像运行其他应用程序一样运行Spring Boot应用程序。调试Spring Boot应用程序也很容易,不需要任何特殊的IDE插件或扩展。

八 开发者工具

Spring Boot还包含额外工具以使应用程序开发更为方便快捷。在maven中添加开发者工具如下:

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

开发者工具提供了热加载、缓存禁用等有用的特性,可以尝试~

注:文章参考Spring Boot官方文档完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值