SpringBoot中指定某些类优先启动

一、需求

  1、项目中对某些IP地址和端口做了限制,只有写在配置文件的内容(ip)才可以访问项目。

  2、在进行测试案例运行时保证读取配置文件中ip和port的类(CbeConfig)得提前运行。

二、工作

  1、如下的测试时肯定不行

    @Test
    public void getCbeTest(){
        CbeConfig cbeConfig = new CbeConfig();
        System.out.println("IP是" + cbeConfig.getIp());
        System.out.println("Port是" + cbeConfig.port);
    }

  2、保证CbeConfig类在程序运行起来的那一刻先存在,先写一个读取配置的类,程序运行起来后读取到配置后,然后再将读取的参数设置到另一个类(CbeConfigAfter)中,以后提取参数。都使用CbeConfigAfter。

  CbeConfigBefore类实现ApplicationRunner接口的run方法

package com.example.demo;

import lombok.Getter;
import lombok.Setter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component

public class CbeConfigBefore implements ApplicationRunner {

    @Value("${cbe.ip}")
    public  String ip;


    @Value("${cbe.port}")
    public  Integer port;

    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {
        System.out.println("我第一个启动");
        System.out.println("哈哈ip" + ip);
        System.out.println("哈哈port" + port);
        CbeConfigAfter cbeConfigAfter = CbeConfigAfter.getInstance();
        cbeConfigAfter.setIp(ip);
        cbeConfigAfter.setPort(port);
        System.out.println("设置完毕");
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }
}

   CbeConfigAfter类写成单例模式

package com.example.demo;


import lombok.Getter;
import lombok.Setter;

public class CbeConfigAfter {

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
    }

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    String ip;

    int port;

    private static CbeConfigAfter cbeConfigAfter;
    private CbeConfigAfter (){}
    public static synchronized CbeConfigAfter getInstance() {
        if (cbeConfigAfter == null) {
            cbeConfigAfter = new CbeConfigAfter();
        }
        return cbeConfigAfter;
    }
}

  测试类

package com.example.demo.controllerTest;

import com.example.demo.CbeConfigAfter;
import com.example.demo.CbeConfigBefore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class CbeTest {



    @Test
    public void getCbeByAfterTest(){
        CbeConfigAfter instance = CbeConfigAfter.getInstance();
        System.out.println("IP是" + instance.getIp());
        System.out.println("端口是" + instance.getPort());
    }

    @Test
    public void getCbeBeforeTest(){
        CbeConfigBefore cbeConfig = new CbeConfigBefore();
        System.out.println("IP是" + cbeConfig.getIp());
        System.out.println("Port是" + cbeConfig.port);
    }
}

  此时再运行getCbeByAfterTest测试类,OK,搞定。

虽然搞定,但是我还是仍有心有疑虑,请有幸读完的同志挑挑毛病。谢谢。

三、补充总结

  1、自定义文件不能使用.yml结尾

  今天又再次尝试,发现上面的方法太LOW了,其实可以直接自己定义一个person.properties。注意不能定义为person.yml文件,因为如果这样定义,是无法加载到person.yml中的内容(亲测过)。

person.name=xx
person.age=20

  2、Bean的类

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

@Component
@Getter
@Setter
@PropertySource("classpath:defineConfig/person.properties")
@ConfigurationProperties(prefix = "person")
public class Person {
  String name;
  Integer age;
}

  3、使用这样的方式去注入Person

  @Autowired
  Person person;

  4、测试类

import cn.com.acca.ramsibe.config.authinfo.AirlineAuthInfo;
import cn.com.acca.ramsibe.config.authinfo.AuthIpInfo;
import cn.com.acca.ramsibe.config.authinfo.Person;
import cn.com.acca.ramsibe.config.ibeconfig.IbeConfigInfo;
import cn.com.acca.ramsibe.config.ibeconfig.IbeServer;
import lombok.extern.java.Log;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
@Log
public class IbeConfigTest {

  @Autowired
  Person person;

  @Test
  public void PersonTest() {
    System.out.println("年龄" + person.getAge());
  }
}

 

  

本文来自博客园,作者:编程狸,转载请注明原文链接:https://www.cnblogs.com/ping-pong/p/11605166.html

原文地址:https://www.cnblogs.com/ping-pong/p/11605166.html