springboot知识收集

自用(持续更新)

Spring Boot 核心配置文件 bootstrap & application 详解

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

  • boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
  • boostrap 里面的属性不能被覆盖

bootstrap/ application 的应用场景

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap 配置文件有以下几个应用场景。

  • 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  • 一些固定的不能被覆盖的属性
  • 一些加密/解密的场景;

application.properties和application.yml文件的区别

一般上来说,当我们创建一个SpringBoot项目时,IDE会默认帮我们创建一个application.properties配置文件。有些朋友习惯把.properties文件改成.yml文件。那么这两种文件类型有什么区别呢?

yml语言以数据为中心

1.内容格式比较:
.properties文件,通过.来连接,通过=来赋值,结构上,没有分层的感觉,但比较直接。
.yml文件,通过:来分层,结构上,有比较明显的层次感,最后key赋值的:后需要留一个空格

2.执行顺序
如果工程中同时存在application.properties文件和 application.yml文件,yml文件会先加载,而后加载的properties文件会覆盖yml文件。所以建议工程中,只使用其中一种类型的文件即可。

Spring常见注解

1、@Configuration

从Spring3.0,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContextAnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。

@Configurationpublic 
class TaskAutoConfiguration 
{    
    @Bean    
    @Profile("biz-electrfence-controller")    
    public BizElectrfenceControllerJob bizElectrfenceControllerJob() 
    {        
        return new BizElectrfenceControllerJob();   
    }    
    @Bean    
    @Profile("biz-consume-1-datasync")    
    public BizBikeElectrFenceTradeSyncJob bizBikeElectrFenceTradeSyncJob() 
    {        
        return new BizBikeElectrFenceTradeSyncJob();  
    }
}

2、@ComponentScan

做过web开发的同学一定都有用过@Controller,@Service,@Repository注解,查看其源码你会发现,他们中有一个共同的注解@Component,没错@ComponentScan注解默认就会装配标识了@Controller,@Service,@Repository,@Component注解的类到spring容器中。

@ComponentScan(value = "com.abacus.check.api")
public class CheckApiApplication 
{    
    public static void main(String[] args) 
    {        
        SpringApplication.run(CheckApiApplication.class, args);    
    }
} 

@SpringBootApplication注解也包含了@ComponentScan注解,所以在使用中我们也可以通过@SpringBootApplication注解的scanBasePackages属性进行配置。

@SpringBootApplication(scanBasePackages = {"com.abacus.check.api","com.abacus.check.service"})
public class CheckApiApplication 
{    
    public static void main(String[] args) 
    {        
        SpringApplication.run(CheckApiApplication.class, args);   
    }
}

3、@Conditional

@Conditional是Spring4新提供的注解,通过@Conditional注解可以根据代码中设置的条件装载不同的bean,在设置条件注解之前,先要把装载的bean类去实现Condition接口,然后对该实现接口的类设置是否装载的条件。Spring Boot注解中的@ConditionalOnProperty、@ConditionalOnBean等以@Conditional*开头的注解,都是通过集成了@Conditional来实现相应功能的。

4、@Import

通过导入的方式实现把实例加入springIOC容器中。可以在需要时将没有被Spring容器管理的类导入至Spring容器中。

//类定义
public class Square {}public class Circular {}
//导入
@Import({Square.class,Circular.class})
@Configurationpublic 
class MainConfig{}

5、@ImportResource

和@Import类似,区别就是@ImportResource导入的是配置文件。

@ImportResource("classpath:spring-redis.xml")      
//导入xml配置
public class CheckApiApplication 
{    
    public static void main(String[] args) 
    {       
        SpringApplication.run(CheckApiApplication.class, args);
    }
}

6、@Component

@Component是一个元注解,意思是可以注解其他类注解,如@Controller @Service @Repository。带此注解的类被看作组件,当使用基于注解的配置和类路径扫描的时候,这些类就会被实例化。其他类级别的注解也可以被认定为是一种特殊类型的组件,比如@Controller 控制器(注入服务)、@Service服务(注入dao)、@Repository dao(实现dao访问)。@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注,作用就相当于 XML配置,

Spring Boot常见注解

说完与Spring Boot密切相关的几个Spring基础注解后,下面我们就再一起看看Spring Boot提供的核心注解的内容吧!

1、@SpringBootApplication

这个注解是Spring Boot最核心的注解,用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。实际上这个注解是@Configuration,@EnableAutoConfiguration,@ComponentScan三个注解的组合。由于这些注解一般都是一起使用,所以Spring Boot提供了一个统一的注解@SpringBootApplication。

@SpringBootApplication(exclude = {        
    MongoAutoConfiguration.class,        
    MongoDataAutoConfiguration.class,       
    DataSourceAutoConfiguration.class,        
    ValidationAutoConfiguration.class,        
    MybatisAutoConfiguration.class,        
    MailSenderAutoConfiguration.class,})
public class API 
{    
    public static void main(String[] args)
{     
    SpringApplication.run(API.class, args); 
}
}

2、@EnableAutoConfiguration

允许 Spring Boot 自动配置注解,开启这个注解之后,Spring Boot 就能根据当前类路径下的包或者类来配置 Spring Bean。

如:当前类路径下有 Mybatis 这个 JAR 包,MybatisAutoConfiguration 注解就能根据相关参数来配置 Mybatis 的各个 Spring Bean。

@EnableAutoConfiguration实现的关键在于引入了AutoConfigurationImportSelector,其核心逻辑为selectImports方法,逻辑大致如下:

  • 从配置文件META-INF/spring.factories加载所有可能用到的自动配置类;
  • 去重,并将exclude和excludeName属性携带的类排除;
  • 过滤,将满足条件(@Conditional)的自动配置类返回;
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage//导入AutoConfigurationImportSelector
@Import({EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration 
{ 
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";    
    Class<?>[] exclude() default {}; 
    String[] excludeName() default {};
}

3、@SpringBootConfiguration

这个注解就是 @Configuration 注解的变体,只是用来修饰是 Spring Boot 配置而已,或者可利于 Spring Boot 后续的扩展。

4、@ConditionalOnBean

@ConditionalOnBean(A.class)仅仅在当前上下文中存在A对象时,才会实例化一个Bean,也就是说只有当A.class 在spring的applicationContext中存在时,这个当前的bean才能够创建。

@Bean//当前环境上下文存在DefaultMQProducer实例时,才能创建RocketMQProducerLifecycleBean
@ConditionalOnBean(DefaultMQProducer.class)
public RocketMQProducerLifecycle rocketMQLifecycle()
{     
    return new RocketMQProducerLifecycle();
}   

5、@ConditionalOnMissingBean

组合@Conditional注解,和@ConditionalOnBean注解相反,仅仅在当前上下文中不存在A对象时,才会实例化个Bean。

  @Bean  //仅当当前环境上下文缺失RocketMQProducer对象时,才允许创建RocketMQProducer Bean对象  
@ConditionalOnMissingBean(RocketMQProducer.class)  
public RocketMQProducer mqProducer() 
{    
    return new RocketMQProducer(); 
}

6、@ConditionalOnClass

组合 @Conditional 注解,可以仅当某些类存在于classpath上时候才创建某个Bean。

  @Bean  //当classpath中存在类HealthIndicator时,才创建HealthIndicator Bean对象  
@ConditionalOnClass(HealthIndicator.class)  
public HealthIndicator rocketMQProducerHealthIndicator(Map<String, DefaultMQProducer> producers) {      
    if (producers.size() == 1) {      
        return new RocketMQProducerHealthIndicator(producers.values().iterator().next());      } 
}

Spring Boot开启的2种方式

使用Spring Boot很简单,先添加基础依赖包,有以下两种方式

1. 继承spring-boot-starter-parent项目

<parent>   
<groupId>org.springframework.boot</groupId>   
<artifactId>spring-boot-starter-parent</artifactId>   
<version>1.5.6.RELEASE</version>
</parent>

2. 导入spring-boot-dependencies项目依赖

<dependencyManagement>   
<dependencies>       
<dependency>          
<groupId>org.springframework.boot</groupId>      
<artifactId>spring-boot-dependencies</artifactId>           <version>1.5.6.RELEASE</version>  
<type>pom</type>       
<scope>import</scope>     
</dependency></dependencyManagement>

springboot不需要独立的容器,它内置了 Tomcat/ Jetty 等容器。

Spring Boot Starters启动器

Starters是什么?


Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成Spring及其他技术,而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库,只要加入spring-boot-starter-data-jpa启动器依赖就能使用了。

Starters包含了许多项目中需要用到的依赖,它们能快速持续的运行,都是一系列得到支持的管理传递性依赖。

Starters命名


Spring Boot官方的启动器都是以spring-boot-starter-命名的,代表了一个特定的应用类型。

第三方的启动器不能以spring-boot开头命名,它们都被Spring Boot官方保留。一般一个第三方的应该这样命名,像mybatis的mybatis-spring-boot-starter。

Starters分类


1. Spring Boot应用类启动器

启动器名称 功能描述
spring-boot-starter 包含自动配置、日志、YAML的支持。
spring-boot-starter-web 使用Spring MVC构建web 工程,包含restful,默认使用Tomcat容器。
... ...

2. Spring Boot生产启动器

启动器名称 功能描述
spring-boot-starter-actuator 提供生产环境特性,能监控管理应用。

3. Spring Boot技术类启动器

启动器名称 功能描述
spring-boot-starter-json 提供对JSON的读写支持。
spring-boot-starter-logging 默认的日志启动器,默认使用Logback。
... ...

在 Spring Boot 启动的时候运行一些特定的代码

可以实现接口 ApplicationRunner 或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个 run 方法

Runner启动器


如果你想在Spring Boot启动的时候运行一些特定的代码,你可以实现接口 ApplicationRunner或者 CommandLineRunner,这两个接口实现方式一样,它们都只提供了一个run方法。

CommandLineRunner:启动获取命令行参数。

public interface CommandLineRunner {    
    /**    
* Callback used to run the bean.    
* @param args incoming main method arguments    
* @throws Exception on error    */   
    void run(String... args) throws Exception; 
}

ApplicationRunner:启动获取应用启动的时候参数。

public interface ApplicationRunner {    
    /**    
    * Callback used to run the bean.    
    * @param args incoming application arguments    
    * @throws Exception on error    
    */   
    void run(ApplicationArguments args) throws Exception; 
}

使用方式


import org.springframework.boot.*import org.springframework.stereotype.*
@Componentpublic 
    class MyBean implements CommandLineRunner {  
        public void run(String... args) 
        {     
            // Do something... 
        } 
    }

或者这样

@Beanpublic CommandLineRunner init() 
{  
    return (String... strings) -> {    };
}

如果启动的时候有多个ApplicationRunner和CommandLineRunner,想控制它们的启动顺序,可以实现 org.springframework.core.Ordered接口或者使用 org.springframework.core.annotation.Order注解。

Spring Boot读取配置的几种方式

Spring Boot 可以通过 @PropertySource,@Value,@Environment, @ConfigurationProperties 来绑定变量

推荐和默认的日志框架

Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架,如果你使用starters启动器,Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架,Spring Boot都支持配置将日志输出到控制台或者文件中。

spring-boot-starter启动器包含spring-boot-starter-logging启动器并集成了slf4j日志抽象及Logback日志框架

原文地址:https://www.cnblogs.com/lzxulxy/p/11641923.html