SpringBoot(二)——属性注入的几种方法和对一些疑问的简单源码剖析

在上一篇讲到优雅的配置properties属性,那是一个怎么的优雅法呢?接下来先来写写上一次遗留的优雅配置,所谓优雅就是看起来一目了然很简洁。

属性配置文件的导入(属性配置文件的名字一定要是application)

在这里插入图片描述
属性配置文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/Mybatis?serverTimezone=GMT&useSSL=FALSE
jdbc.username=root
jdbc.password=wrial.qq.com

JdbcProperties:相当于JavaBean的作用,用来盛装properties属性,以方便注入(这里我用到了lombok插件,如果不使用插件的话,就必须写Getter和Setter方法)。

package com.example.demo.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@ConfigurationProperties("jdbc")
@Data
public class JdbcProperties {
    String url;
    String driverClassName;
    String username;
    String password;
}

JdbcConfig:用Spring来管理Jdbc的配置

package com.example.demo.config;


import com.alibaba.druid.pool.DruidDataSource;
import com.example.demo.config.JdbcProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@EnableConfigurationProperties(JdbcProperties.class)
public class JdbcConfig {

    @Bean
    public DataSource dataSource(JdbcProperties jdbcProperties){
        DruidDataSource druidDataSource = new DruidDataSource();
        druidDataSource.setDriverClassName(jdbcProperties.getDriverClassName());
        druidDataSource.setUrl(jdbcProperties.getUrl());
        druidDataSource.setUsername(jdbcProperties.getUsername());
        druidDataSource.setPassword(jdbcProperties.getPassword());
        return druidDataSource;
    }

}

WebBootDemo:controller的代码,并注入已经配置到Spring里的dataSourse。

package com.example.demo.webdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

@RestController
public class WebBootDemo {
    @Autowired
    private DataSource dataSource;

    @GetMapping("/hello")
    public String hello() {
        return "Hello Everyone!";
    }
}

打上断点进行调试,发现dataSourse已经注入进去了!
在这里插入图片描述
哈哈,这几种方法随便挑哈,喜欢那个用哪个!


你以为这就完了?不,上边这个只能算清晰,看到下面例子你就知道什么是优雅了!

配置文件

jdbc.driver-class-name=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/Mybatis?serverTimezone=GMT&useSSL=FALSE
jdbc.username=root
jdbc.password=wrial.qq.com

JdbcConfig,就这几行代码就够了

@Configuration
public class JdbcConfig {
    @Bean
    @ConfigurationProperties("jdbc")
    public DataSource dataSource() {
        return new DruidDataSource();
    }

}

访问,并查看dataSource的注入情况:注入成功!
在这里插入图片描述
总结:加上第一篇博客,也一共有三种注入方法了,至于选择哪一种就要看在那种情况,比如第三种适合配一些个例需要的。要根据场景来选择用哪一种!


使用yaml进行属性注入

yaml是什么呢,它类似于properties,但是要比properties更强大,它可以配置一个对象,甚至一个集合等。下面我们就来使用一下yaml。
yaml的语法非常严格,在每一个冒号后都必须有一个空格,否则它会认为你这个是一句话,尤其注意的是,不能在声明前缀的那一行写任何东西!否则会报错。
在这里插入图片描述
application.yaml

jdbc:
      driverClassName: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/Mybatis?serverTimezone=GMT&useSSL=FALSE
      username: root
      password: wrial.qq.com

调试,可以看到注入成功
在这里插入图片描述
这就是使用yaml文件注入,以后基本就用yaml了。
疑问1:那系统加载是先加载哪一种配置文件呢?如果两个配置文件有重复呢?如果两个文件同一属性但是值不同它又以那个为准呢?
在SpringBoot的加载中,两种文件不分先后,两个文件系统会取并集,因此重复的部分也就没什么问题了,但是两个文件的同一个属性值不同,那就取properties文件的内容。

疑问2:我在前边写SpringBoot的时候,有一次吧如下图的红线所连的类位置写反了,发现项目报错。
在这里插入图片描述
为什么调换就出错呢?为什么我们没有配置包扫描可以扫到我们的controller呢?今天就来解密。打开SpringBootApplication的源码瞧瞧,发现有一个扫描组件的配置。
在这里插入图片描述
虽然没有下载成功带注释的源码,因此我只能看纯代码的源码,**但是查看容器扫描的代码可以发现resourcePattern默认扫描的是SpringBootApplication所在类的包下的所有类。**这不是正好解决了我的疑问嘛!
在这里插入图片描述
但是我就要某某某的包结构,怎么办?这就得配置扫描了,在SpringBoot的默认扫描器已经不适合我们了!
不使用默认,就可以在SpringBootApplication下加一个扫描的注解。如下:
在这里插入图片描述
这个注解和我们Spring中的一样,可以扫描单个类
在这里插入图片描述
这个注解从源码来看是可以又两种类型,一种是包,一种是类
在这里插入图片描述
在这里插入图片描述
也可以扫描包
在这里插入图片描述
那ComponentScans注解呢?我们可以从源码清楚的看到,它就是上一个注解的数组形式
在这里插入图片描述
可以一次配置多个类或多个包!(记住一个原则:有不知道的东西就看源码!)

这个随个人喜好,但是把SpringBootApplication放在最外层是不是就可以免去配置了,少一点配置就少出一点错。无论是自动配置还是手动配置都有它存在的理由!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值