Spring Boot 基础使用

文章目录

    • 使用Spring Boot
      • 构建系统(bulid system)
        • 依赖管理
        • Maven构建项目
          • 继承Starter Parent
          • 不使用Parent pom
          • Spring Boot Maven 插件
      • 构建代码
        • 默认包(default package)
        • 运行主类
        • 配置类
          • 导入额外的配置类
          • 导入XML配置
        • 自动配置
          • 禁用指定的配置类
        • Spring Bean和依赖注入
        • @SpringBootApplication注解使用
        • 运行程序
          • 在IDE上运行
          • 运行打包之后的程序
          • 使用Maven插件
          • 热部署
        • 开发工具

本篇博客参照 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


    org.springframework.boot
    spring-boot-starter-parent
    2.1.3.RELEASE

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

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


    Fowler-SR2

查看Spring Boot 支持的属性列表

不使用Parent pom

        
        
            
            org.springframework.boot
            spring-boot-dependencies
            2.1.3.RELEASE
            pom
            import
        
    

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


    
        
        
            org.springframework.data
            spring-data-releasetrain
            Fowler-SR2
            pom
            import
        
        
            org.springframework.boot
            spring-boot-dependencies
            2.1.3.RELEASE
            pom
            import
        
    

Spring Boot Maven 插件

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


    
        
            org.springframework.boot
            spring-boot-maven-plugin
        
    

构建代码

默认包(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容器中进行管理。是以前的(以前使用在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"部分。

开发工具

你可能感兴趣的:(springboot)