springboot的多种配置方式

  • java配置主要靠java类和一些注解,比较常用的注解有:

  • @Configuration :声明一个类作为配置类,代替xml文件

  • @Bean :声明在方法上,将方法的返回值加入Bean容器,代替 标签

  • @Value :基本类型或String属性注入

  • @PropertySource :指定外部属性文件

  • 后面以Druid连接池配置为例,数据库名称为springboot_test

方式一

  1. <!--pom.xml -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  1. # src/resources/jdbc.properties
  2. jdbc.driverClassName=com.mysql.jdbc.Driver
  3. jdbc.url=jdbc:mysql://127.0.0.1:3306/bos
  4. jdbc.username=root
  5. jdbc.password=123456
  1. //src\main\java\com\itheima\config\DruidConfig.java
  2. @Configuration
  3. @PropertySource("classpath:jdbc.properties")
  4. public class DruidConfig {
  5. @Value("${jdbc.url}")
  6. String url;
  7. @Value("${jdbc.driverClassName}")
  8. String driverClassName;
  9. @Value("${jdbc.username}")
  10. String username;
  11. @Value("${jdbc.password}")
  12. String password;
  13. @Bean
  14. public DataSource dataSource() {
  15. DruidDataSource dataSource = new DruidDataSource();
  16. dataSource.setDriverClassName(driverClassName);
  17. dataSource.setUrl(url);
  18. dataSource.setUsername(username);
  19. dataSource.setPassword(password);
  20. return dataSource;
  21. }
  22. }

解读:

  • @Configuration :声明我们 DruidConfig是一个配置类

  • @PropertySource :指定属性文件的路径是: classpath:jdbc.properties

  • @Value 为属性注入值(只能是基本类型或String)

  • @Bean将 dataSource() 方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容器中。

方式二

  1. <!--pom.xml -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  12. <!-- ============不添加在IDEA 会报红,但并不影响功能 ================= -->
  13. <dependency>
  14. <groupId> org.springframework.boot </groupId>
  15. <artifactId>spring-boot-configuration-processor</artifactId>
  16. <optional>true</optional>
  17. </dependency>
  18. <!--============================================================== -->
  1. # src/resources/application.properties
  2. jdbc.driverClassName=com.mysql.jdbc.Driver
  3. jdbc.url=jdbc:mysql://127.0.0.1:3306/bos
  4. jdbc.username=root
  5. jdbc.password=123456
  1. //src\main\java\com\itheima\config\DruidConfig.java
  2. @ConfigurationProperties(prefix = "jdbc")
  3. public class DruidProperties {
  4. private String url;
  5. private String driverClassName;
  6. private String username;
  7. private String password;
  8. public String getUrl() {
  9. return url;
  10. }
  11. public void setUrl(String url) {
  12. this.url = url;
  13. }
  14. public String getDriverClassName() {
  15. return driverClassName;
  16. }
  17. public void setDriverClassName(String driverClassName) {
  18. this.driverClassName = driverClassName;
  19. }
  20. public String getUsername() {
  21. return username;
  22. }
  23. public void setUsername(String username) {
  24. this.username = username;
  25. }
  26. public String getPassword() {
  27. return password;
  28. }
  29. public void setPassword(String password) {
  30. this.password = password;
  31. }
  32. }
  1. //src\main\java\com\itheima\config\DruidConfig.java
  2. @Configuration
  3. @EnableConfigurationProperties(DruidProperties.class)
  4. public class DruidConfig {
  5. @Bean
  6. public DataSource dataSource(DruidProperties dp) {
  7. DruidDataSource dataSource = new DruidDataSource();
  8. dataSource.setDriverClassName(dp.getDriverClassName());
  9. dataSource.setUrl(dp.getUrl());
  10. dataSource.setUsername(dp.getUsername());
  11. dataSource.setPassword(dp.getPassword());
  12. return dataSource;
  13. }
  14. }

解读:

  • @ConfifigurationProperties注解声明当前类为属性读取类,在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致。

  • @EnableConfigurationProperties()声明要使用的属性读取类,使用该类有三种注入方式

1. @Autowired注入

  1. //src\main\java\com\itheima\config\DruidConfig.java
  2. @Configuration
  3. @EnableConfigurationProperties(DruidProperties.class)
  4. public class DruidConfig {
  5. @Autowired
  6. private DruidProperties dp;
  7. @Bean
  8. public DataSource dataSource() {
  9. DruidDataSource dataSource = new DruidDataSource();
  10. //setter
  11. return dataSource;
  12. }
  13. }

2. 构造函数注入

  1. ```
  2. //src\main\java\com\itheima\config\DruidConfig.java
  3. @Configuration
  4. @EnableConfigurationProperties(DruidProperties.class)
  5. public class DruidConfig {
  6. private DruidProperties dp;
  7. public DruidConfig(DruidProperties dp){ this.dp = dp; }
  8. @Bean
  9. public DataSource dataSource() {
  10. DruidDataSource dataSource = new DruidDataSource();
  11. //setter
  12. return dataSource;
  13. }
  14. }
  15. ```

3. 作为@Bean的方法参数注入(本例使用)

  1. //src\main\java\com\itheima\config\DruidConfig.java
  2. @Configuration
  3. @EnableConfigurationPerProperties(DruidProperties.class)
  4. public class DruidConfig {
  5. @Bean
  6. public DataSource dataSource(DruidProperties dp) {
  7. DruidDataSource dataSource = new DruidDataSource();
  8. //setter
  9. return dataSource;
  10. }
  11. }

方式二通过属性读取类解决了@Value不能读取对象属性(如user.friend.name)的问题,但似乎就更加麻烦了

方式三(推荐使用)

事实上,如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类。

  1. <!--pom.xml -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  12. <!-- ============不添加在IDEA 会报红,但并不影响功能 ================= -->
  13. <dependency>
  14. <groupId> org.springframework.boot </groupId>
  15. <artifactId>spring-boot-configuration-processor</artifactId>
  16. <optional>true</optional>
  17. </dependency>
  18. <!--============================================================== -->
  1. # src/resources/application.properties
  2. jdbc.driverClassName=com.mysql.jdbc.Driver
  3. jdbc.url=jdbc:mysql://127.0.0.1:3306/bos
  4. jdbc.username=root
  5. jdbc.password=123456
  1. @Configuration
  2. public class DruidConfig {
  3. @Bean
  4. @ConfigurationProperties(prefix = "jdbc")
  5. public DataSource dataSource() {
  6. return new DruidDataSource();
  7. }
  8. }

方式四

  1. <!--pom.xml -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.1.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <scope>runtime</scope>
  11. </dependency>
  1. # src/resources/application.properties
  2. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
  3. spring.datasource.driverClassName=com.mysql.jdbc.Driver
  4. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/bos
  5. spring.datasource.username=root
  6. spring.datasource.password=123456

思考:为什么这种方式不需要配置类可以读取配置信息?

启动类跑main方法时候,查看SpringApplication构造方法,如下追踪

容易发现,它是从 META-INF/spring.factories 中获取类名信息,存储在一键多值的Map中,打开spring.factories,debug对比

发现键是文件蓝色部分,值是绿色部分,往回看不难发现它将这些获取的类都生成了实例,注入到IOC容器中。

打开 DataSourceProperties 发现这不是方式二吗?

点进DataSourceProperties.class

总结:

当我们添加依赖后,执行启动类时自动加载DataSourceAutoConfiguration,读取DataSourceProperties类,根据默认的前缀spring.datasource在application.xml中读取信息

最后

掌握这些springboot的配置方式,会让你在工作中处理事情来更轻松,觉得文章对你有帮助的话还请给我点个赞,你的支持,就是我创作最大的动力!

掌握这些springboot的配置方式,让你工作效率翻个倍!的更多相关文章

  1. 最香远程开发解决方案!手把手教你配置VS Code远程开发工具,工作效率提升N倍

    文章每周持续更新,原创不易,「三连」让更多人看到是对我最大的肯定.可以微信搜索公众号「 后端技术学堂 」第一时间阅读(一般比博客早更新一到两篇) 今天和大家分享远程开发工具,分享一下我平常是如何用 V ...

  2. SpringBoot学习(三)-->Spring的Java配置方式之读取外部的资源配置文件并配置数据库连接池

    三.读取外部的资源配置文件并配置数据库连接池 1.读取外部的资源配置文件 通过@PropertySource可以指定读取的配置文件,通过@Value注解获取值,具体用法: @Configuration ...

  3. SpringBoot学习(二)-->Spring的Java配置方式

    二.Spring的Java配置方式 Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 1.@Configuration 和 @Bean Spring的Java配置方式是通过 @ ...

  4. SpringBoot学习(二)——Spring的Java配置方式

    Java配置是Spring4.x推荐的配置方式,可以完全替代xml配置. 一.@Configuration 和 @Bean Spring的Java配置方式是通过@Configuration和@Bean ...

  5. SpringBoot 整合 Mybatis + Mysql——XML配置方式

    一.介绍 SpringBoot有两种方法与数据库建立连接,一种是集成Mybatis,另一种用JdbcTemplate,本文主要讨论集成Mybatis方式. SpringBoot整合Mybatis也有两 ...

  6. SpringBoot系列-整合Mybatis(XML配置方式)

    目录 一.什么是 MyBatis? 二.整合方式 三.实战 四.测试 本文介绍下SpringBoot整合Mybatis(XML配置方式)的过程. 一.什么是 MyBatis? MyBatis 是一款优 ...

  7. SpringBoot集成MyBatis的Bean配置方式

    SpringBoot集成MyBatis的Bean配置方式 SpringBoot是一款轻量级开发的框架,简化了很多原先的xml文件配置方式,接下来就介绍一下如何不适用XML来配置Mybatis spri ...

  8. SpringBoot 2.0 编程方式配置,不使用默认配置方式

    SpringBoot的一般配置是直接使用application.properties或者application.yml,因为SpringBoot会读取.perperties和yml文件来覆盖默认配置: ...

  9. SpringBoot 优雅配置跨域多种方式及Spring Security跨域访问配置的坑

    前言 最近在做项目的时候,基于前后端分离的权限管理系统,后台使用 Spring Security 作为权限控制管理, 然后在前端接口访问时候涉及到跨域,但我怎么配置跨域也没有生效,这里有一个坑,在使用 ...

随机推荐

  1. 5G-第五代移动通信系统(5th generation mobile/wireless/cellular system)

    通信系统 有意义的信息交流被称为通讯. 自然界:狼嚎.狗叫.虫鸣.鸡叫. 人类社会:说话.眼神.写信.烽火台. 目的:信息的传递. 人类发明电以后,开始使用电来传递信息,特别快. 于是有了电报.电话以 ...

  2. MySQL备份和恢复[3]-mysqldump备份工具

    mysqldump 概述 逻辑备份工具: mysqldump, mydumper, phpMyAdmin Schema和数据存储在一起.巨大的SQL语句.单个巨大的备份文件 mysqldump:是My ...

  3. vue知识点15

    1.回调地狱的三种方案:函数    promise     async await          2. 子组件与子组件之间的传递: 可以借用公共父元素.子组件A  this.$emit(" ...

  4. IDEA安装IDEA阿里Java规范插件

    插件安装方式有两种: 1.通过在线方式安装,搜索后找到,点击Install安装即可: 2.去官网plugins下载对应插件离线包,地址:https://plugins.jetbrains.com/pl ...

  5. OpenSpiel 随笔 05.14

    ------------恢复内容开始------------ 这两天年总算把自己的游戏写完了,也通过了所有的测试. 我将自己的代码上传到了我的github上, 地址是 https://github.c ...

  6. MapReduce工作原理详解

    文章概览: 1.MapReduce简介 2.MapReduce有哪些角色?各自的作用是什么? 3.MapReduce程序执行流程 4.MapReduce工作原理 5.MapReduce中Shuffle ...

  7. 深入理解Java注解类型(@Annotation)

    http://blog.csdn.net/javazejian/article/details/71860633  出自[zejian的博客] java注解是在JDK5时引入的新特性,鉴于目前大部分框 ...

  8. vue中iframe加载慢,给它加loading效果

    js框架:vue ui框架:element 因为iframe加载慢,所以在它加载完成前添加loading效果,loading用的是element家的加载效果 <template> < ...

  9. CodeForces 题目乱做

    是个补题记录. 1419 除了 F 场上都过了. CF1419A Digit Game 这题好多人 FST 啊-- 考虑如果串长为奇数那么最后操作的肯定是第一个人,串长为偶数的最后操作的肯定是第二个, ...

  10. P1948 [USACO08JAN]Telephone Lines S

    题意描述 在无向图中求一条从 \(1\) 到 \(N\) 的路径,使得路径上第 \(K+1\) 大的边权最小. 等等,最大的最小...如此熟悉的字眼,难道是 二分答案. 下面进入正题. 算法分析 没错 ...