资讯专栏INFORMATION COLUMN

最渣的 Spring Boot 文章

yanest / 3569人阅读

摘要:如删除临时文件,清除缓存信息,读取配置文件信息,数据库连接等。提供的接口也可以满足该业务场景。不同点中方法的参数为,而接口中方法的参数为数组。

spring-boot-starter-parent

Maven的用户可以通过继承spring-boot-starter-parent项目来获得一些合理的默认配置。这个parent提供了以下特性:

默认使用Java 8

使用UTF-8编码

一个引用管理的功能,在dependencies里的部分配置可以不用填写version信息,这些version信息会从spring-boot-dependencies里得到继承。

识别过来资源过滤(Sensible resource filtering.)

识别插件的配置(Sensible plugin configuration (exec plugin, surefire, Git commit ID, shade).)

能够识别application.properties和application.yml类型的文件,同时也能支持profile-specific类型的文件(如: application-foo.properties and application-foo.yml,这个功能可以更好的配置不同生产环境下的配置文件)。

maven把默认的占位符${…​}改为了@..@(这点大家还是看下原文自己理解下吧,我个人用的也比较少
since the default config files accept Spring style placeholders (${…​}) the Maven filtering is changed to use @..@ placeholders (you can override that with a Maven property resource.delimiter).)

starter

启动器包含一些相应的依赖项, 以及自动配置等.

Auto-configuration

Spring Boot 支持基于Java的配置, 尽管可以将 SpringApplication 与 xml 一起使用, 但是还是建议使用 @Configuration.

可以通过 @Import 注解导入其他配置类, 也可以通过 @ImportResource 注解加载XML配置文件.

Spring Boot 自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序. 例如, 如果项目中引入 HSQLDB jar, 并且没有手动配置任何数据库连接的bean, 则Spring Boot会自动配置内存数据库.

您需要将 @EnableAutoConfiguration 或 @SpringBootApplication 其中一个注解添加到您的 @Configuration 类中, 从而选择进入自动配置.
禁用自动配置
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属性, 并指定全限定名来达到相同效果. 最后, 你可以通过 spring.autoconfigure.exclude 属性 exclude 多个自动配置项(一个自动配置项集合)

@ComponentScan

SpringBoot在写启动类的时候如果不使用 @ComponentScan 指明对象扫描范围, 默认指扫描当前启动类所在的包里的对象.

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

使用 @SpringBootApplication 注解相当于使用了下面三个注解.

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

ApplicationRunner or CommandLineRunner 区别

应用服务启动时,加载一些数据和执行一些应用的初始化动作。如:删除临时文件,清除缓存信息,读取配置文件信息,数据库连接等。

1、SpringBoot提供了CommandLineRunner接口。当有该接口多个实现类时,提供了@order注解实现自定义执行顺序,也可以实现Ordered接口来自定义顺序。

注意:数字越小,优先级越高,也就是@Order(1)注解的类会在@Order(2)注解的类之前执行。

import com.example.studySpringBoot.service.MyMethorClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(value=1)
public class SpringDataInit implements CommandLineRunner {

    @Autowired
    private MyMethorClassService myMethorClassService;

    @Override
    public void run(String... strings) throws Exception {
        int result = myMethorClassService.add(8, 56);
        System.out.println("----------SpringDataInit1---------"+result);
    }
}

2、SpringBoot提供的ApplicationRunner接口也可以满足该业务场景。不同点:ApplicationRunner中run方法的参数为ApplicationArguments,而CommandLineRunner接口中run方法的参数为String数组。想要更详细地获取命令行参数,那就使用ApplicationRunner接口

import com.example.studySpringBoot.service.MyMethorClassService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;

@Component
public class SpringDataInit3 implements ApplicationRunner,Ordered {

    @Autowired
    private MyMethorClassService myMethorClassService;

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        int result = myMethorClassService.add(10, 82);
        System.out.println("----------SpringDataInit3---------"+result);
    }

    @Override
    public int getOrder() {
        return 3;
    }
}
外部化配置

Spring Boot允许你外部化你的配置,这样你就可以在不同的环境中使用相同的应用程序代码,你可以使用 properties 文件、YAML文件、环境变量和命令行参数来外部化配置,属性值可以通过使用 @Value 注解直接注入到你的bean中,通过Spring的 Environment 抽象访问,或者通过 @ConfigurationProperties 绑定到结构化对象。

@ConfigurationProperties("spring.datasource.username")

Spring Boot使用一种非常特殊的 PropertySource 命令, 该命令旨在允许对值进行合理的覆盖, 属性按以下顺序考虑:

Devtools全局设置属性在你的主目录( ~/.spring-boot-devtools.properties 当devtools处于激活状态时。

测试中的 @TestPropertySource 注解

测试中的 @SpringBootTest#properties 注解属性

命令行参数

来自 SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的内联JSON)的属性

ServletConfig 初始化参数

ServletContext 初始化参数

java:comp/env 中的JNDI属性

Java系统属性(System.getProperties()

操作系统环境变量

一个只有random.*属性的RandomValuePropertySource

在你的jar包之外的特殊配置文件的应用程序属性(application-{profile}.properties 和YAML 变体)

在jar中打包的特殊配置文件的应用程序属性(application-{profile}.properties 和YAML 变体)

在你的jar包之外的应用程序属性(application.properties 和YAML 变体)

打包在jar中的应用程序属性(application.properties 和YAML 变体)

@PropertySource 注解在你的 @Configuration 类上

默认属性(通过设置 SpringApplication.setDefaultProperties 指定)

访问命令行属性

在默认情况下, SpringApplication 会转换任何命令行选项参数 (也就是说,参数从 -- 开始, 像 --server.port=9000) 到一个 property, 并将它们添加到Spring Environment 中, 如前所述, 命令行属性总是优先于其他属性源.

如果不希望将命令行属性添加到 Environment 中, 你可以使用 SpringApplication.setAddCommandLineProperties(false) 禁用它们.

应用程序属性文件

SpringApplication 在以下位置从 application.properties 文件加载属性并将它们添加到Spring Environment :

当前目录子目录的 /config

当前目录

类路径下 /config

类路径的根目录

列表按优先顺序排序(在列表中较高的位置定义的属性覆盖在较低位置定义的属性).

特殊配置文件的属性

我们可能在不同环境下使用不同的配置, 这些配置有可能是在同一个文件中或不同文件中.

1.在相同文件中

##################################### Determime which configuration be used
spring: 
      profiles: 
            active: "dev"
      # Mysql connection configuration(share)
      datasource: 
            platform: "mysql"
            driverClassName: "com.mysql.cj.jdbc.Driver"
            max-active: 50
            max-idle: 6
            min-idle: 2
            initial-size: 6
            
---
##################################### for dev environment
spring: 
      profiles: "dev"
      datasource: 
            # mysql connection user(dev)
            username: "root"
            # mysql connection password(dev)
            password: "r9DjsniiG;>7"
---
##################################### for product environment
spring: 
      profiles: "product"
      datasource: 
            # mysql connection user(product)
            username: "root"
            # mysql connection password(product)
            password: "root"
---
##################################### for test environment
spring: 
      profiles: "test"
      datasource: 
            # mysql connection user(test)
            username: "root"
            # mysql connection password(test)
            password: "root"

这样在配置完相同属性的时, 还可以对不同的环境进行不同的配置.

2.多个配置文件.

我们可以把特定环境的配置, 放入多个配置文件中, 但是要按照 application-{profile}.properties 格式. 如下图.

spring.profiles.active 属性进行设置.

我们也可以把配置文件放在 jar 外面, 使用 spring.config.location 属性进行设置.

java -jar beetltest-0.0.1-SNAPSHOT.jar -spring.config.location=classpath:/application.properties

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77445.html

相关文章

  • 渣的有赞面试经历(一)

    摘要:和的区别,本想问下要不要深入的讲下源码级别,结果面试官说不用了。来分钟不到,就再次打电话过来约了明早上午点的视频面试。 出去面试的话还是得好好准备,不然会被虐的有点惨! 有赞(框架组) 四月份面试有赞的时候,自己还在实习,所以也没有复习,是在 Boss 直聘上投的,当时看到了有赞的 2018 届春招,就投了下,然后不知道怎么就被推到了框架组,结果后面就感觉自己被虐的可惨了。 关注我 s...

    GraphQuery 评论0 收藏0
  • 记录一次用echarts插件画饼图时遇到的问题.

    摘要:近期在开发中遇到一个问题就是用插件画饼图时图例是横向排布的时候如果换行了如何让图例图标对齐由于网上关于这个的处理方案具体实现细节的解答比较少所以写出来问题展示图如下如图所示第二行的图例并没有和第一行的图例对齐这是因为插件在图例横向排列的时候 近期,在开发中遇到一个问题,就是用echarts插件画饼图时,图例是横向排布的时候,如果换行了,如何让图例图标对齐?由于网上关于这个的处理方案具体...

    Galence 评论0 收藏0
  • 一个JAVA渣渣的校招成长记,附BAT美团网易等20家面经总结

    摘要:作者重庆森林链接来源牛客网整个三月份通过牛客网和网友分享的经验学到了很多东西,现在反馈一下我的面试经历,希望对同学们有帮助。个人情况大三本方向渣硕,经过实验室学长内推,于三月底完成面试。校招是实力和运气的结合,缺一不可。 欢迎关注我的微信公众号:Java面试通关手册(坚持原创,分享美文,分享各种Java学习资源,面试题,以及企业级Java实战项目回复关键字免费领取):showImg(h...

    mozillazg 评论0 收藏0
  • 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!

    摘要:你如何理解中的可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成及其他技术,而不需要到处找示例代码和依赖包。如你想使用访问数据库,只要加入启动器依赖就能使用了。 面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望。 下面,我给大家总结...

    haoguo 评论0 收藏0
  • Spring Boot 学习资料收集

    摘要:系列文章更新计划列表主要对一些中常用的框架进行简单的介绍及快速上手,外加相关资料的收集更新列表会不定期的加入新的内容以进行扩充,如果你对此感兴趣可以站内联系我。 导读: 从第一次接触Spring Boot 至今已经有半年多了,在这期间也浏览了许多和Spring Boot 相关的书籍及文章,公司里面的许多项目也一直在使用Spring Boot。关于Spring Boot的一些看法:Spr...

    mmy123456 评论0 收藏0

发表评论

0条评论

yanest

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<