栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot基础

SpringBoot基础
  • SpringBoot是什么
  • SpringBoot项目构建
  • SpringBoot基础注解
    • @Conditional
    • @import
    • @ConfigurationProperties
  • 依赖管理大致与自动配置大致原理
    • 依赖管理
    • 自动配置

SpringBoot是什么

SpringBoot是为了整合其他框架所设计出来的一个“总框架”。利用SpringBoot的两大特性依赖管理和自动配置可以简单的整合其他框架,简化了其他框架的使用难度。

SpringBoot项目构建

在pom文件中导入SpringBoot的父工程以及应用场景的起步依赖即可完成SpringBoot的配置。

    
        org.springframework.boot
        spring-boot-starter-parent
        2.1.8.RELEASE
    
    
    
        org.springframework.boot
        spring-boot-starter-web
    

编写引导类(SprongBoot项目启动的起点)启动SpringBoot项目。

@SpringBootApplication
public class ApplicationMain {
    public static void main(String[] args) {
        SpringApplication.run(ApplicationMain.class, args);
    }
}
SpringBoot基础注解 @Conditional
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface Conditional {
    Class[] value();
}

该注解需要传入一个实现了Condition接口的实现类的Class类对象,该接口规定的方法只有一个且返回值为boolean类型。
该注解规定了该注解的添加位置只能是类上或者方法上。
当该注解添加到类或者方法上时,当接口中的方法返回值为true时该类或者方法生效,负责不生效。
在@Conditional注解的基础上,SpringBoot封装了一系列条件判断注解便于判断添加该注解的类或者方法是否生效(是否存在某个bean、class或者环境(如web环境)等等)。

@import
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface import {
    Class[] value();
}

该注解只能添加到类上,并且需要传入一个或者多个Class类对象。该注解会将这些Class类对象注册到SpringIOC容器中去。

@ConfigurationProperties
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@documented
public @interface ConfigurationProperties {
    @AliasFor("prefix")
    String value() default "";

    @AliasFor("value")
    String prefix() default "";

    boolean ignoreInvalidFields() default false;

    boolean ignoreUnknownFields() default true;
}

该注解可以添加在类或者方法上。通过@ConfigurationProperties注解可以给类上或者方法上的字段或者参数绑定application.yaml文件夹中带有prefix或者 value属性值前缀的数值。
需要注意的是在使用@ConfigurationProperties注解时,该类必须是一个bean因此必须添加@Component注解或者不添@Component注解而是在其他bean上添加@EnableConfigurationProperties注解,将 value属性设置成添加了@ConfigurationProperties注解的类的calss类对象即可。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@documented
@import({EnableConfigurationPropertiesimportSelector.class})
public @interface EnableConfigurationProperties {
    Class[] value() default {};
}
依赖管理大致与自动配置大致原理 依赖管理

当构建SpringBoot项目时,我们需要导入了SpringBoot的父工程以及应用场景的起步依赖。
父项目主要提供了各种技术的版本信息组合了一套最优的技术版本。
各种起步依赖里面定义了该场景所需的jar包的坐标合集,并且大部分版本来源于父工程这样不会出现版本冲突等问题。
当我们构建SpringMVC项目时,我们需要导入很多jar包还会因为版本原因出现报错等等问题。而SpringBoot构建web场景时只需要导入web的起步依赖,通过依赖传递就可以简单方便的获取到需要的jar包,而且不会出现版本冲突等问题。
这样就解决了jar包管理的问题大大简化了开发。

自动配置

该程序是SpringBoot的引导类,是SoringBoot程序的起点也是这一步完成了各种bean的自动配置。

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

通过观看@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}
)}
)

@SpringBootConfiguration注解它的底层其实是一个@Configuration注解。它的功能只是说明它是一个配置类。
@ComponentScan注解则定义了默认的包扫描规则,默认扫描引导类所在的包及其子包。
首先由于扫描注解默认只扫描引导类所在的包及其子包这就导致其他jar包的配置类不能被扫描到。而自动配置的关键注解@EnableAutoConfiguration解决了这个问题。它主要是利用@import注解加载了AutoConfigurationimportSelector.class进入IOC容器,而该类的selectimports方法将会把可能需要加载的所有配置类的全类名封装到一个String数组中返回,而SpringBoot框架将会根据这些全类名来加载这些配置类。这个方法获取全类名的底层原理是扫描所有jar包的meta-INF/spring.factories文件来获取全类名。这些全类名是提前写好的。但是Spring框架不会加载全部的配置类而是会根据@Conditional的派生注解中的信息来判断是否加载某个配置类以及这个配置类中的bean。

    public String[] selectimports(Annotationmetadata annotationmetadata) {
        if (!this.isEnabled(annotationmetadata)) {
            return NO_importS;
        } else {
            AutoConfigurationmetadata autoConfigurationmetadata = AutoConfigurationmetadataLoader.loadmetadata(this.beanClassLoader);
            AutoConfigurationimportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationmetadata, annotationmetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
@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 {};
}

SpringBoot的自动配置文件。
Mybatis的自动配置文件。
其中一个可能会被加载的一个配置类,当满足@ConditionalOnClass注解的条件时就会被加载否则就不会被加载到IOC容器中去。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/362571.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号