Spring Boot 入门

导读:本篇文章讲解 Spring Boot 入门,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

概述

Spring Boot简化Spring应用开发,约定大于配置,去繁从简,just run 就能创建一个独立的,产品级别的应用。

优点

  • 快速创建独立运行的Spring项目以及与主流框架集成。
    方便与三方框架集成。
  • 使用嵌入式的Servlet容器,应用无需打成WAR包。
  • starters自动依赖与版本控制。
    版本控制容易,jar包版本一致性。
  • 大量的自动配置,简化开发,也可修改默认值。
  • 无需配置XML,无代码生成,开箱即用。
  • 准生产环境的运行时应用监控。
  • 与云计算的天然集成。

微服务

2014,martin fowler发表了一篇介绍微服务的文章。
微服务是一种架构风格。

  • 一个应用应该是一组小型服务的组合;可以通过http等协议的调用方式进行互通。
  • 每个功能元素最终都是一个可单独替换和独立升级的软件单元。

简单的hello world场景

浏览器请求服务器,服务器接收请求并返回hello world给浏览器。

创建Idea 创建Spring boot 项目

在这里插入图片描述

编写Controller

在这里插入图片描述

浏览器调用接口

在这里插入图片描述

打包部署

pom.xml中添加maven插件

在这里插入图片描述

maven执行打包命令

在这里插入图片描述

命令行执行jar包

在这里插入图片描述

场景启动器

parent启动器之版本管理

	<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <!-- starter-parent父项目,用来真正的管理不同依赖的版本 -->
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.4.4</version>
  </parent>

spring-boot-starter-parent项目用来作为依赖版本的仲裁中心,我们在导入依赖Jar包时可以不写版本号;
对于不在spring-boot-dependencies中管理的组件包,我们还是要添加版本号的。

自动导入依赖组件

不同的场景启动器把需要依赖的组件导入,启动器就是一系列相关组件的组合,无需手动导入相关组件了,启动器中的没有指定版本号的组件版本受parent启动器的版本管理。
比如web场景启动器:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!-- spring-boot-starter-web中具体内容 -->
   <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.4.4</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.4.4</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.4.4</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>5.3.5</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.5</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>

springboot内置了许多场景启动器,需要用到相应场景时直接导入启动器依赖即可,相关组件都会自动导入,版本由springboot自动管理。
可以查看官网看看有哪些场景启动器:https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot

下面是部分截图:
在这里插入图片描述

主程序类(入口类)

@SpringBootApplication
public class PracticeApplication {

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

@SpringBootApplication

Spring Boot应用注解标注在某个类上,说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。
@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 {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default {};

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "nameGenerator"
    )
    Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

@SpringBootConfiguration

标注在某个类上,表示这是SpringBoot的配置类。
@SpringBootConfiguration内容:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;
}

可以看到@SpringBootConfiguration其实就是Spring中的@Configuration注解,作用一样,只是通过不同的名称做一个项目区分而已。

@Configuration

标注在某个类上,表示这是一个java config配置,作用相等于Spring中的xml配置文件,且本身是一个@Component标注的Spring 容器中的组件。

@EnableAutoConfiguration

开启自动配置功能
以前我们需要配置的东西,Spring Boot帮我们自动配置了,SpringBoot就是通过@EnableAutoConfiguration来告诉自己开启自动配置功能,这样自动配置才能生效。

@EnableAutoConfiguration内容

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

@AutoConfigurationPackage

自动配置包注解。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
    String[] basePackages() default {};
    Class<?>[] basePackageClasses() default {};
}

@Import({Registrar.class}):@Import 是Spring的底层注解,给容器导入一个组件;导入哪些组件由Registrar.class来指定。

static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }
        // getPackageNames将主配置类(@SpringBootApplication标注的类)所在的包及其子包中所有的组件(组件标注的bean)导入Spring容器中。
        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
            AutoConfigurationPackages.register(registry, (String[])(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames().toArray(new String[0]));
        }
        public Set<Object> determineImports(AnnotationMetadata metadata) {
            return Collections.singleton(new AutoConfigurationPackages.PackageImports(metadata));
        }
    }

从上面可以看到@AutoConfigurationPackage 注解的作用:将主配置类(@SpringBootApplication标注的类)所在的包及其子包中所有的组件(组件标注的bean)扫描到Spring容器中。

@Import({AutoConfigurationImportSelector.class})

  1. 该注解是告诉Springboot导入哪些组件的选择器到Spring容器中,这些组件选择器主要是一些自动配置类(类似与Spring中整合三方框架的xml配置文件)。
  2. 组件选择器就是各种自动配置类(xxxAutoConfiguration),这些配置类就是给容器中导入这个场景(比如使用redis功能场景)需要的所有组件,并配置好这些组件。
// 将所有需要导入的组件以全类名的方式返回,这些组件都会都会被导入到容器中。
public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
// 通过SpringFactoriesLoader.loadFactoryNames找到springboot应用类路径下的所有jar包中的META-INFO/spring.factories中EnableAutoConfiguration变量对应的自动配置类。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
        return configurations;
    }
    
  • spring.factories的内容如下:
    在这里插入图片描述
    这些自动配置类就免去了我们手动编写配置注入功能组件的工作
  • 通过下图可以看到configurations就是autoconfigure包下面的各种配置类。
    在这里插入图片描述
  1. 总结
    SpringBoot在启动的时候从类路径下的所有META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效了,帮忙我们进行自动配置工作;所有以前我们自己配置的东西,这些自动配置类都帮忙我们完成了。
    J2EE的整体整合方案和自动配置都spring-boot-autoconfigure-2.4.4.jar包下的 org.springframework.boot.autoconfigure包中。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/100362.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!