SpringBoot配置文件

2019-11-07  本文已影响0人  失吾爱后而心死
(1) .yml和.yaml格式配置文件

application.yml

  lastName: zhangsan
  age: 18
  boss: false
  birth: 2019/10/10
  maps: {k1: v1,k2: v2}
  lists:
    - lisi
    - wangwu
    - zhaoliu
  myDog:
    name: 小狗
    age: 3

引用这个配置文件,这里出现@ConfigurationProperties注解报错,引入@Component解决

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    
    private  String lastName;
    private Integer age;
    private Boolean boss;
    private Date birth;
    private Map<String ,Object> maps;
    private List<Object>lists;
    private Dog myDog;
}

测试,在Test文件中

@SpringBootTest
@RunWith(SpringRunner.class)
class DemoApplicationTests {

    @Autowired
    private Person person;

    @Test
    void contextLoads() {
        System.out.println(person);
    }
}

这里需要注意,如果报错,请检查pom.xml文件是否配置正确,同时检查Person 实体及其他相关是否在根目录下,即与

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

在同一个目录下,正常配置,则可以看到,控制台会输出:
Person{lastName='zhangsan', age=18, boss=false, birth=Thu Oct 10 00:00:00 CST 2019, maps={k1=v1, k2=v2}, lists=[lisi, wangwu, zhaoliu], myDog=Dog{name='小狗', age=3}}
配置文件获取成功。

(2) .properties格式配置文件
person.last-name=zhangsan
person.age=12
person.birth=2015/15/15
person.boss=false
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.my-dog.name=卡哇伊
person.my-dog.age=5

装配方式和上面一致,但是打印出来出现了中文乱码:
Person{lastName='lisi', age=12, boss=false, birth=Tue Mar 15 00:00:00 CST 2016, maps={k1=v1, k2=v2}, lists=[a, b, c], myDog=Dog{name='������', age=5}}
更改idea的Encoding可以解决。

(3) 加载指定的配置文件
@ConfigurationProperties 默认从全局文件中获取值
@ProperitySource加载指定的配置文件,实现与全局无关的配置单独设置配置文件

为上面例子中的Person单独写一个配置文件 personal.properties,内容与上面的application.properties一致的。
更改绑定方式为:

@PropertySource(value = {"classpath:personal.properties"})

也是可以在控制台看到输出结果的,但是有个问题如果把@ConfigurationProperties(prefix = "person")这个内容注释掉,输出的内容value都是null,不注释掉则正常输出绑定的personal.properties中的值,这点还没搞懂,但教程是这么干的。

(4) 导入Srping配置文件

Spring Boot没有Spring的配置文件,我们自己新建文件,也不能自动识别,想让Spring Boot 识别,我们需要借助@ImprotResouce来导入。
新建文件beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="helloService" class=" com.example.demo.service.HelloService"/>
</beans>

在主配置类上添加@ImportResource(locations = "classpath:beans.xml")

@ImportResource(locations = "classpath:beans.xml")
@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

添加测试

    @Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService() {
        boolean b = ioc.containsBean("helloService");
        System.out.println(b);
    }

输出为true,则spring的配置文件导入成功。

(5)SpringBoot推荐使的导入配置文件方法

用全注解的方式,不使用配置文件,使用配置类替代配置文件。

 * @Configuration 指明当前类是一个配置类,替代之前的sprig配置文件
 * 如何添加组件?
 * @Bean  将方法的返回值添加到容器中,这个组件默认的id就是当前方法名
 */
@Configuration
public class MyConfig {
    @Bean
    public HelloService helloService(){
        System.out.println("配置类给容器中添加组件");
        return new HelloService();
    }
}

测试

@RunWith(SpringRunner.class)
class HelloWorldTest {

    @Autowired
    private Person person;

    @Autowired
    ApplicationContext ioc;

    @Test
    public void testHelloService() {
        boolean b = ioc.containsBean("helloService");
        System.out.println(b);
    }

    @Test
    void main() {
        System.out.println(person);
    }}

控制台打印出

2019-11-07 09:43:35.990  INFO 9256 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-11-07 09:43:36.597  INFO 9256 --- [           main] c.l.s.HelloWorldTest                     : Started HelloWorldTest in 4.83 seconds (JVM running for 9.888)

true

证明配置文件导入成功。

(6)配置文件的占位符

1.随机数
person.last-name=张三${random.uuid}
person.age=1${random.int}
2.占位符获取之前配置的值,如果没有可以使用:指定默认值
person.my-dog.name=${person.hello:hello}_dog
如果person.hello获取不到值,则配置默认的“hello”这个值

(7)多环境支持,Profile
1.多Profile方式

我们在主配置文件编写的时候,可以写多个文件,文件名可以是application-{profile}.properties/yml
例如:
application-dev.properties
application-prod.properties
我们在这两个文件中,指定了不同的端口号,用于区分开发环境下使用的,和生产环境下使用的端口。

2.多文档块

yml有一种语法,可以分成很多的文档块。在同一个文件中就可以实现1和3中说的指定端口操作

  port: 8082
spring:
  profiles:
    active: dev
---
server:
  port: 8083
  spring:
    profiles: dev
---
server:
  port: 8084
  spring:
    profiles: prod
3.激活指定的profile

1.在配置文件中指定
spring.profiles.active=dev
这一局指定了使用开发环境的端口号,也就是我们第一步定义的那个。
2.命令行方式指定
3.虚拟机参数
-Dspring.profiles.active-dev

上一篇下一篇

猜你喜欢

热点阅读