• 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

  • 相关阅读:
    理解爬虫原理
    中文词频统计与词云生成
    了解大数据的特点、来源与数据呈现方式
    羽扇智Java实习面试(offer到手含面试经验及答案)
    易动纷享Java实习面试(offer到手含面试经验及答案)
    酒仙网Java实习面试(offer到手含面试经验及答案)
    华云数据Java实习面试(offer到手含面试经验及答案)
    淘友天下Java实习面试(offer到手含面试经验及答案)
    花旺在线Java实习面试(offer到手含面试经验及答案)
    圆心科技Java实习面试(offer到手含面试经验及答案)
  • 原文地址:https://www.cnblogs.com/ping-pong/p/11605166.html
Copyright © 2020-2023  润新知