当前位置:   article > 正文

【SpringBoot】注解属性注入——图解三种配置方式_springboot 注解参数注入

springboot 注解参数注入

引入

这里有一个jdbc.properties配置文件:

jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/loliDB
jdbc.username=root
jdbc.password=123456
  • 1
  • 2
  • 3
  • 4

如何配置出一个数据连接池的Bean呢?

<!-- 加载外部资源资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>

<!-- DataSource数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

emmmmm…没什么问题。接着往下看。

 
 

Spring配置的历史

xml配置?注解配置?谁才是历史的选择?我们不妨来回顾一下关于Spring配置的历史:

  • Spring1.0时代
    jdk1.5刚刚发布,注解开发并未为人们所熟知,因此一切配置都是xml。想象一下,铺天盖地的xml文件,铺天盖地的bean标签…
  • Spring2.0时代
    Spring此时已经引入了注解开发,但尚未完全完善。也就是说,注解配置并不能完全替代xml配置,所以人们都是两种混合使用。
  • Spring3.0时代及之后
    此时的注解开发已经非常完善,xml文件可以被完全删掉,Spring官方也推荐开发者使用全注解配置。SpringBoot来临后,基本宣告xml配置方式已经缓期死刑。

开发者应该对新事物保持追求,敢于抛弃历史遗留物。因此,无论你对xml文件有着多么深厚感情,我还是推荐你尽快玩转注解。

 
 

Spring注解配置全图解

在这里插入图片描述

 
 

1-通过新注解彻底摆脱xml

在学习Spring的时候我们就知道,使用原始注解无法彻底删除xml文件。因此又引入了诸多新注解。

具体的思路是:将一个类指定为配置类并加载资源文件,将资源文件的一个个配置参数通过 @Value注解 注入到类中的成员变量上,从而得以在配置类中使用资源文件的配置参数,并最终配置好一个连接池Bean对象。

注解说明
@Configuration标明这是一个Spring配置类
@PropertySource用于加载资源文件
@Bean被标注的返回值会直接被放到Spring容器中
@Value原始注解,用于属性注入

代码:

JdbcConfig配置类 ----------------------------------------------------------------------------

@Configuration
@PropertySource("classpath:jdbc.properties")
public class JdbcConfig {

    @Value("${jdbc.driverClassName}")
    String driverClassName;
    @Value("${jdbc.url}")
    String url;
    @Value("${jdbc.username}")
    String username;
    @Value("${jdbc.password}")
    String password;

    @Bean
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

 
 

2-将properties资源文件转化为Properties资源类

上一种使用@Value注入属性的方式有个缺点,那就是只能注入基本数据类型。SpringBoot提供了一种更新的、更强大的配置方式。

具体的思路是:使用 @ConfigurationProperties注解 将一个类指定为属性读取类(也可以叫资源类,该类就成为了application.properties/application.yml资源文件的翻版),再使用 @EnableConfigurationProperties注解 在配置类上引入刚刚的资源类,接着使用set(get())的方式进行Bean对象的配置。

另外注意,资源类默认读取的是application.properties/application.yml,不能再叫jdbc.propeties了。

JdbcProperties资源类 -----------------------------------------------------------------------

@ConfigurationProperties(prefix = "jdbc")
public class JdbcProperties {

    private String driverClassName;
    private String url;
    private String username;
    private String password;

    // get/set方法省略,但必须要有
    // ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
JdbcConfig配置类 ----------------------------------------------------------------------------

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

	// jdbcProperties对象写在方法的参数里可直接使用(自动注入),在这里手动注入也可以
	// @Autowired 
	// private JdbcProperties jdbcProperties;

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

 
 

3-根据对应关系将配置参数直接注入new出的对象

这种配置方式无比优雅与强大。

如果一组配置参数都是给一个Bean对象使用的,那么我们可以将资源文件写在方法上,SpringBoot会自动调用Bean对象的set方法,完成配置参数的注入。

具体的实现是:使用 @ConfigurationProperties注解 直接将资源文件写在方法上,@Bean返回的对象会自动完成参数注入。

JdbcConfig配置类 ----------------------------------------------------------------------------

@Configuration
public class JdbcConfig {

    @Bean
    @ConfigurationProperties(prefix = "jdbc")
    public DataSource dataSource() {
        return new DruidDataSource();
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

 
 

补充:Relaxed binding(松散绑定)

上面的三种注解配置中,除了第一种(Spring新注解),第二种和第三种(SpringBoot提供)都支持松散绑定。那么,什么是松散绑定?

松散绑定即不严格要求资源文件中的属性名,与真正被注入的属性名完全一致。支持驼峰、中划线、下划线等等转换,甚至支持对象引导。

那么什么又是对象引导?

举个例子很容易明白。@Value注解仅支持简单属性的注入,比如用户的名字(user.name);对象引导则支持更加复杂的层级结构,比如用户的朋友的名字(user.friend.name)。

 
 

补充:所有的.properties资源文件可等价替换为.yml文件

认识YAML语言

上面的后两种注解注入方式(SpringBoot提供)中使用的application.properties文件,都可以等价替换为application.yml文件。下面,来进一步学习这种YAML语言。

YAML是一种结构清新简单的非标记语言。YAML之所以被称得上清新简单,是因为它使用空白、冒号、缩进、分行等方式组织数据。下面来直观感受一下吧:

jdbc:
  driverClassName: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/loliDB
  username: root
  password: 123456
  • 1
  • 2
  • 3
  • 4
  • 5

YAML语法

1.树状的层级结构
2.缩进为2个空格
3.冒号后面必须加一个空格

4.如果是数组/集合等结构的数据,格式如下:
loli:
  name: Alice
  age: 12
  friend:
    - Mana
    - Hana

5.如果有多个yml文件,则要用application-xxx.yml命名,然后在application.yml中激活 
# 激活其他配置文件
spring:
  profiles:
    active: xxx,xxx
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

YAML规则

❶ SpringBoot允许多个yml文件,但这些文件的命名必须为 application-xxx.yml,并且要在 application.yml 中激活才能使用(如上)。

❷ 如果properties与yml同时存在于SpringBoot项目中,那么这两类文件都生效;如果存在同名的配置项,则以properties文件的为主。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】

推荐阅读
相关标签