SpringBoot基础学习(三) 自定义配置、随机数设置及参数间引用

自定义配置

SpringBoot免除了项目中大部分手动配置,可以说,几乎所有的配置都可以写在全局配置文件application.peroperties中,SpringBoot会自动加载全局配置文件从而免除我们手动加载的烦恼。但是,如果我们自定义了配置文件,那么SpringBoot是无法识别这些配置文件的,此时需要我们手动加载。

接下来,将针对SpringBoot的自定义配置文件及其加载方式进行讲解。

(1)使用@PropertySource加载配置文件

我们可以使用@PropertySource注解结合@Configuration注解配置类的方式来加载自定义配置文件,@PropertySource注解用于指定自定义配置文件的具体位置和名称。同时,为了保证SpringBoot能够扫描该注解,还需要在类上添加@Configuration注解将实体类作为自定义配置类。

如果需要将自定义配置文件中的属性值注入到对应类的属性中,可以使用@ConfigurationProperties注解或者@Value注解进行属性值注入。

操作步骤:

1、在SpringBoot项目的resources目录下新建一个名为test.properties的自定义配置文件,在该配置文件中编写需要设置的配置属性:

# 对实体类对象MyProperties进行属性配置
test.id=1
test.name=test

2、在com.hardy.springboot_demo.pojo包下新建一个配置类MyProperties,提供test.properties自定义配置文件中对应的属性,并根据@PropertySource注解的使用进行相关的配置:

package com.hardy.springboot_demo.pojo;

/**
 * @Author: HardyYao
 * @Date: 2021/5/31
 */

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@Configuration // 自定义配置类
@PropertySource("classpath:test.properties") // 指定自定义配置文件的文件位置和文件名称
@EnableConfigurationProperties(MyProperties.class) // 开启对应配置类的属性注入功能
@ConfigurationProperties(prefix = "test") // 指定配置文件注入属性前缀
public class MyProperties {

    private int id;

    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "MyProperties{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

这里主要是新建一个自定义配置类,通过相关注解引入了自定义的配置文件,并完成了自定义属性值的注入。

针对上述的几个注解,进行逐一讲解:

  • @Configuration注解表示当前类是一个自定义配置类,并添加为Spring容器的组件,这里也可以使用传统的@Component注解实现相同的功能;
  • @PropertySource("classpath:test.properties")注解指定了定义配置文件的文件位置和文件名称,此处表示自定义配置文件为classpath类路径下的test.properties文件;
  • @ConfigurationProperties(prefix = "test")将上述自定义配置文件test.properties中以test开头的属性值注入到该配置类属性中;
  • 如果配置类上使用的是@Component注解而非@Configuration注解,那么@EnableConfigurationProperties注解还可以省略。

3、编写测试方法进行测试:

@Autowired
private MyProperties myProperties;
@Test
void myPropertiesTest() {
    System.out.println(myProperties);
}

测试结果:

(2)使用@Configuration编写自定义配置类

在SpringBoot框架中,推荐使用配置类的方式向容器中添加和配置组件。

在SpringBoot框架中,通常使用@Configuration注解定义一个配置类,SpringBoot会自动扫描和识别配置类,从而替换传统Spring框架中的XML配置文件。

当自定义一个配置类后,还需要在类中的方法上加上@Bean注解进行组件配置,将方法的返回对象注入到Spring容器中,并且组件名称默认使用的是方法名,当然也可以使用@Bean注解的name或value属性自定义组件的名称。

操作步骤:

1、在com.hardy.springboot_demo包下新建一个config包,并在该包下新建一个MyService类,该类中不需要写任何代码:

package com.hardy.springboot_demo.config;

/**
 * @Author: HardyYao
 * @Date: 2021/5/31
 */
public class MyService {
}

由于该类目前没有任何配置和注解,因此还无法正常被SpringBoot扫描和识别。

2、在config包下,新建一个MyConfig类,并使用@Configuration注解将该类声明为一个配置类,该类的内容如下:

package com.hardy.springboot_demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Author: HardyYao
 * @Date: 2021/5/31
 */
@Configuration // 定义该类为一个配置类
public class MyConfig {

    /**
     * 将返回值对象作为组件添加到Spring容器中,该组件id默认为方法名
     * @return
     */
    @Bean
    public MyService myService(){
        return new MyService();
    }

}

MyConfig是@Configuration注解声明的配置类(类似于声明了一个XML配置文件),该配置类会被SpringBoot自动扫描识别。

使用@Bean注解的myService()方法,其返回值对象会作为组件添加到Spring容器中(类似于XML配置文件中的标签配置),并且该组件id默认为方法名myService。

3、编写测试方法进行测试

@Autowired
private ApplicationContext applicationContext;
    
@Test
void iocTest() {
    System.out.println(applicationContext.containsBean("myService"));
}

上述代码中,先通过@Autowired注解注入Spring容器示例ApplicationContext,然后在测试方法iocTest()中测试查看该容器中是否包含id为myService的组件。

执行测试方法iocTest(),运行结果如下:

从测试结果可以看出,测试方法iocTest()运行成功,显示运行结果为true,表示Spirng的IOC容器中也包含了id为myService的实例对象组件,说明使用自定义配置类的形式完成了向Spring容器进行组件的添加和配置。

随机数设置及参数间引用

在SpringBoot配置文件中设置属性时,除了可以像前面示例中显示的配置属性值外,还可以使用随机值参数间引用对属性值进行设置。下面,针对配置文件中这两种属性值的设置方式进行讲解。

随机值设置

在SpringBoot配置文件中,随机值设置使用到了SpringBoot内嵌的RandomValuePropertySource类,对一些隐秘属性值或者测试用例属性值进行随机值注入。

随机值设置的语法格式为${random.xx},xx表示需要制定生成的随机数类型和范围,它可以生成随机的整数、uuid或字符串,示例代码如下:

my.secret=${random.value} // 配置随机值
my.number=${random.int} // 配置随机整数
my.bignumber=${random.long} // 配置随机long类型数
my.uuid=${random.uuid} // 配置随机uuid类型数
my.number.less.than.ten=${random.int(10)} // 配置小于10的随机整数
my.number.in.range=${random.int[1024,65536]} // 配置范围在[1024,65536]之间的随机整数

上述代码中,使用RandomValuePropertySource类中random提供的随机数类型,分别展示了不同类型随机值的设置示例。

参数间引用

在SpringBoot配置文件中,配置文件的属性值还可以进行参数间的引用,也就是在后一个配置的属性值中直接引用先前定义过的属性,这样就可以直接解析其中的属性值了。

使用参数间引用的好处就是,在多个具有相互关联的配置属性中,只需要对其中一处属性进行预先配置,那么其他地方都可以引用,省去了后续多处修改的麻烦。

参数间引用的语法格式为${xx},xx表示先前在配置文件中已经配置过的属性名,示例代码如下:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

上述参数间引用设置示例中,先设置了“app.name=MyApp”,将app.name属性的属性值设置为了MyApp;接着,在app.description属性配置中,使用${app.name}对前一个属性进行了引用。

接下来,通过一个案例来演示使用随机值设置以及参数间引用的方式进行属性设置的具体使用和效果,具体步骤如下:

1、打开全局配置文件application.properties,在该配置文件中分别通过随机值设置和参数间引用来配置两个属性,示例代码如下:

# 随机值设置以及参数间引用配置
hardy.age=${random.int[20,30]}
hardy.description=hardy的年龄可能是${hardy.age}

在上述application.properties配置文件中,先使用随机数设置了hardy.age的属性值,该属性值的取值范围在[10,20]之间,随后使用参数间引用配置了hardy.description属性。

2、在项目的测试类中添加description属性,并将配置文件中hardy.description的属性进行注入,然后新增一个测试方法进行测试,测试代码如下:

@Value("${hardy.description}")
private String description;

@Test
void placeholderTest() {
    System.out.println(description);
}

在上述代码中,通过@Value("${hardy.description}")注解将配置文件中的hardy.description属性值注入到了对应的description属性中,在测试方法placeholderTest()中对该属性值进行了输出打印。

执行测试方法后,控制台输出结果如下所示:

可以看到,测试方法placeholderTest()成功打印出了description属性的注入内容(age的取值始终在[20,30]之间随机显示),该内容与配置文件中配置的属性值保持一致。

posted @ 2021-06-04 08:35  blayn  阅读(1251)  评论(0编辑  收藏  举报