深入理解Spring IOC之扩展篇(八)、环境变量的校验

简介: 深入理解Spring IOC之扩展篇(八)、环境变量的校验

我们在讲refresh方法的那篇中说到了一个prepareRefresh的方法,这个方法主要是记录容器的状态以及对环境变量的校验,我们来看看这个方法的代码:


protected void prepareRefresh() {
  // 1. 记录下容器开始刷新的时间
  this.startupDate = System.currentTimeMillis();
  // 2. 把容器标为激活状态
  synchronized (this.activeMonitor) {
    this.active = true;
  }
  if (logger.isInfoEnabled()) {
    logger.info("Refreshing " + this);
  }
  // 3. ClassPathXmlApplicationContext的时候调的是个空方法,跳过~
  initPropertySources();
  // 4. 调用StandardEnvironment中的validateRequiredProperties方法
  getEnvironment().validateRequiredProperties();
}


我的注释上面写的很明确,3是个空方法,另外,我曾在正篇的第三篇中说过,4这里最后是没有做任何事情的。所以我们可以得出一个结论,在默认情况下,spring容器的启动是不依赖任何的环境变量的。如果我们想增加我们自己的校验环境变量的逻辑应该怎么做呢?这里分为两种情况,对应的做法也不相同,我们分别来看一下:


有人肯定会问自定义校验环境变量的逻辑有什么用,emmm,其实我自己觉得,这个作用还是很大的,比如,你可以让你的应用跑在对应的机器上嘛。环境变量这里的信息还是非常多的,不知道各位读者注意过没有。


第一种情况,你的项目是个普通的Spring而不是SpringBoot项目,此时我们可以这么做:

配置类,仅用作配置


@Configuration
@ComponentScan("com.example.test")
public class Config {
}


负责校验的bean


@Component
public class ConfigCheckBean implements EnvironmentAware {
    private ConfigurableEnvironment environment;
    @Override
    public void setEnvironment(Environment environment) {
        if (environment instanceof ConfigurableEnvironment){
            ConfigurableEnvironment environment1 = (ConfigurableEnvironment)environment;
            this.environment = environment1;
        }
        init();
        this.environment.validateRequiredProperties();
    }
    private void init() {
        this.environment.setRequiredProperties("aaa");
    }
}


测试代码:


public static void main(String[] args) {
    AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(Config.class);
}


由于我没有增加任何key为aaa的环境变量,所以此时启动当时是报错了:


1686813805640.png


第二种情况是,当你的项目是个SpringBoot项目时,我们可以这样做:


@SpringBootApplication
@MapperScan(basePackages = {"com.example.studyspringbootdemo.mybatis.mapper"})
public class StudyspringbootdemoApplication {
  public static void main(String[] args) {
      // 将SpringApplication中的ApplicationContext替换,然后启动
    SpringApplication springBootApplication = new SpringApplication(StudyspringbootdemoApplication.class);
    springBootApplication.setApplicationContextClass(MyApplicationContext.class);
    springBootApplication.run();
  }
    // 继承SpringBoot中默认使用的AnnotationConfigServletWebServerApplicationContext并重写initPropertySources方法
  public static class MyApplicationContext extends AnnotationConfigServletWebServerApplicationContext{
    @Override
    protected void initPropertySources() {
        // 因为父类的initPropertySources并不为空,所以为了保持正常运行逻辑必须调用父类方法
      super.initPropertySources();
      // 添加"aaa"的校验
      getEnvironment().setRequiredProperties("aaa");
    }
  }
}


同样的,启动会失败,因为我并没有对应环境变量:


1686813813681.png

目录
相关文章
|
13天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
13天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
22 0
|
13天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
20 0
|
16天前
|
Java Spring 容器
【Spring系列笔记】IOC与DI
IoC 和 DI 是面向对象编程中的两个相关概念,它们主要用于解决程序中的依赖管理和解耦问题。 控制反转是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入和依赖查找。
33 2
|
16天前
|
Java 测试技术 数据库连接
Spring中ioc的优点
总之,Spring中的IoC提供了一种更加灵活、可维护、可测试和可扩展的方式来管理组件之间的依赖关系,从而提高了应用程序的质量和可维护性。这使得开发人员能够更专注于业务逻辑而不是底层的技术细节。
32 1
|
23天前
|
JSON Java 数据格式
Spring Boot实现各种参数校验
这些是Spring Boot中实现参数校验的一些常见方法,你可以根据项目需求选择适合的方式来进行参数校验。
16 0
|
25天前
|
Java 应用服务中间件 Spring
|
26天前
|
XML Java 数据格式
Spring IOC的源码解析
【4月更文挑战第17天】Spring IOC(控制反转)的核心功能是通过依赖注入(DI)来管理对象的创建和它们之间的依赖关系。要深入理解Spring IOC的工作原理,我们可以从其源码分析入手,特别是关注如何创建和管理Bean以及依赖注入的实现
20 1
|
1月前
|
XML Java 数据格式
Spring IOC—基于XML配置和管理Bean 万字详解(通俗易懂)
Spring 第二节 IOC—基于XML配置和管理Bean 万字详解!。
94 5
|
1月前
|
XML Java 数据格式
Spring(一)IOC小案例
Spring(一)IOC小案例