Spring Boot 基础使用


本篇博客参照 Spring Boot官方文档,算是简单的翻译,虽然之前也学过但是没有系统阅读官方文档,有很多地方遗漏,现在重新阅读官方文档,这篇博客就当作阅读笔记,会尽量精简。因为没有使用过gradle,所以gradle部分都去掉了。

使用Spring Boot

构建系统(bulid system)

推荐使用支持依赖管理的构建工具,比如maven和gradle。

依赖管理

每一个版本的Spring Boot都有它们所支持的依赖清单,实际上,我们不需要为这些依赖指定版本号,Spring Boot已经为我们对其做了管理。当Spring Boot版本升级的时候,这些依赖也进行了升级。

当然这些依赖可以指定为某个版本。

每一个Spring Boot都和一个Spring Framework的基础版本关联,官方建议不要为其指定版本。

Maven构建项目

Maven使用者可以从spring-boot-starter-parent 工程中继承获得合理的默认依赖。父工程提供了以下特性:

  • Java 1.8作为默认的版本

  • UTF-8的编码格式

  • 继承自spring-boot-dependencies pom的依赖关系管理部分,用于管理公共依赖关系的版本。此依赖关系管理允许我们在自己的pom中使用时省略这些依赖项的标记。

  • 合理的资源过滤

  • 合理的配置文件。applicaton.propertiesapplication.yml,以及指定的文件(application-dev.propertiesapplication-dev.yml)

继承Starter Parent
<!-- Inherit defaults from Spring Boot -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.3.RELEASE</version>
</parent>

只需要在这个依赖指定Spring Boot的版本,其他的starter上就不要指定版本号了。

同时也可以重写一个属性来覆盖掉个人的依赖,比如,当需要升级到另一个版本的Spring Data时,在pom.xml 中插入以下代码

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

查看Spring Boot 支持的属性列表

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

上面的配置不允许重写个人依赖的版本号,如果要重写,需要在Spring Boot前面添加属性。比如,要指定Spring-data-releasetrain的版本,pom应该进行如下配置。

<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.1.3.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
Spring Boot Maven 插件

通过maven打包命令,产生的jar包可以直接运行。

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

构建代码

默认包(default package)

当一个class没有申明包名时,这个类被默认为在(default package)中。应该避免这样的使用方式,这样可能会引起使用了@ComponentScan@EntityScan@SpringBootApplication注解的Spring Boot应用,因为每个jar包中的每个类都被读取了。应当遵循java推荐的包命名公约,使用反向域名作为包名,比如com.example.project

运行主类

Spring Boot官方推荐在把主类放在其他类之上的根包中,一般用在主类上。@SpringBootApplication的源码如下,

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
        @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
        @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
....
}

可见,@SpringBootApplication@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan组成。

  • @SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法。

  • @EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的jar包来配置你项目的默认配置,比如根据spring-boot-starter-web,来判断你的项目是否需要添加了webmvctomcat,就会自动的帮你配置web项目中所需要的默认配置。

  • @ComponentScan,扫描当前包及其子包下被@Component@Controller@Service@Repository注解标记的类并纳入到spring容器中进行管理。是以前的<context:component-scan>(以前使用在xml中使用的标签,用来扫描包配置的平行支持)。所以本demo中的User为何会被spring容器管理。

最基础的Application.java如下,会声明一个main方法

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);
    }

}
配置类

Spring Boot更倾向于基于java的配置。虽然也可以使用XML的配置,但是更推荐使用基于@Configration注解的配置类。

导入额外的配置类

我们不需要把所有的@Configuration注解放到单独的类中,可以使用@Import注解来导入其他的配置类。 此外,可以使用@ComponentScan注解来自动扫描所有的Spring 组件,包括加了@Configuration注解的配置类。

如果必须使用xml作为配置的话,官方推荐在使用了@Configuration注解的类中,加上@ImportResource注解来加载xml配置文件。

导入XML配置

仍然使用@Configuration类。然后,可以使用@ImportResource批注来加载XML配置文件。

自动配置
禁用指定的配置类

使用@EnableAutoConfiguration注解的exclude属性,如下

import org.springframework.boot.autoconfigure.*;
import org.springframework.boot.autoconfigure.jdbc.*;
import org.springframework.context.annotation.*;

@Configuration
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class MyConfiguration {
}

如果类不在类classpath中,则可以使用注解的excludeName属性并指定类的全名,比如

@SpringBootApplication(excludeName = {“com.learn.Example”})

Spring Bean和依赖注入

Spring Boot可以使用标准的Spring Framework的方式去构建Spring Bean以及依赖注入。简单一点,通常使用@ComponentScan(找到bean)和@Autowired(注入依赖)。
如果所有的类都在根包中,那么可以使用不带任何属性的@ComponentScan注解,就可以把所有带了@Component, @Service, @Repository, @Controller等注解的类注册为Spring Bean。
下面是一个使用了@Service注解注册一个Bean对象的实例,并且通过依赖注入获取了一个RiskAssessorBean对象。

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;
	}

	// ...

}

如果只有一个构造器,可以省略@Autowired注解,如下:

@Service
public class DatabaseAccountService implements AccountService {

	private final RiskAssessor riskAssessor;

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

	// ...

}

一般在项目中,@Autowired会放在需要注入的域上(通常会有很多需要注入的依赖),这样可以不用写构造器,但是编译器通常会警告,但不会影响程序运行。

@SpringBootApplication注解使用

@SpringBootApplication注解包含了以下注解的特性:

  • @EnableAutoConfiguration:启用SpringBoot的自动配置机制
  • @ComponentScan:在应用程序所在的包上启用对@Component注解的扫描
  • @Configuration:允许在上下文中注册额外的bean或导入其他配

@SpringBootApplication注解相当于使用了以上三个使用默认配置的注解,如以下所示:

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);
	}

}

Spring Boot不强制使用这些注解,我们可以使用其他功能来替换掉单个注解。比如,我们不想在程序中使用@ComponentScan

package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.ComponentScan
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

@Configuration
@EnableAutoConfiguration
@Import({ MyConfig.class, MyAnotherConfig.class })
public class Application {

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

}

在此示例中,Application与任何其他Spring Boot应用程序一样,只是不会自动检测
@Component注解修饰的类,并且显式导入用户定义的bean(请参阅@Import)。

运行程序

包程序打包成jar包的形式并且使用内置的HTTP服务器的最好的好处之一是,我们可以像其他程序一样来运行这个程序。Spring Boot程序进行Debugger也非常容易,不需要特使的IDE插件和扩展程序。

这一节只讲述程序打包成jar情况,如果想要把程序打包成war包的话,需要参考使用IDE和相应的中间件。

在IDE上运行

这里须要导入项目程序,在不同的IDE上有不同的操作,官方文档并没有详细讲述,不过CSDN上有很多博客都是介绍这一方面的,请自行查阅。

  • 如果不小心点了两次运行程序按钮,会出现端口号已被使用类似的错误,这个时候只能强制结束这个进程。
运行打包之后的程序

如果使用了Spring Boot 的Maven或者Gradle插件生成了一个可执行jar包,可以执行下面java -jar命令来运行该jar包:

$ java -jar target/myapplication-0.0.1-SNAPSHOT.jar

也可以使用一远程调用的方式来运行打包过的程序,下面的命令可以将调试器附加到打包的应用程序:

$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \
       -jar target/myapplication-0.0.1-SNAPSHOT.jar
使用Maven插件

Spring Boot的Maven插件提供了一个快速编译运行程序的run指令。程序会以exploded的形式运行,和IDE中相同。下面是使用Maven方式运行Spring Boot程序的命令:

$ mvn spring-boot:run

我们也可以使用MAVEN_OPS来改变环境变量,如下:

$ export MAVEN_OPTS=-Xmx1024m
热部署

由于Spring Boot只是普通的java应用程序,因此JVM的热部署应该是开箱即用的。但是JVM的热部署受限于字节码文件。想要一个更完美的解决方案的话,可以使用JRebel
spring-boot-devtools模块也支持Spring Boot的快速重启,相关细节可以参考下面的Develop Tools(开发工具)章节以及swapping "How-to"部分。

开发工具
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值