深入理解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

目录
相关文章
|
5天前
|
XML Java 数据格式
【SpringFramework】Spring IoC-基于XML的实现
本文主要讲解SpringFramework中IoC和DI相关概念,及基于XML的实现方式。
96 69
|
3天前
|
Java Spring 容器
【SpringFramework】Spring IoC-基于注解的实现
本文主要记录基于Spring注解实现IoC容器和DI相关知识。
36 21
|
10天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
8天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
30天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
53 2
|
2月前
|
XML 缓存 Java
搞透 IOC、Spring IOC ,看这篇就够了!
本文详细解析了Spring框架的核心内容——IOC(控制反转)及其依赖注入(DI)的实现原理,帮助读者理解如何通过IOC实现组件解耦,提高程序的灵活性和可维护性。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
45 0
|
3月前
|
Java 数据库 数据安全/隐私保护
Spring 微服务提示:使用环境变量抽象数据库主机名
Spring 微服务提示:使用环境变量抽象数据库主机名
50 1
|
3月前
|
存储 开发框架 Java
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
文章详细介绍了Spring、IOC、DI的概念和关系,解释了控制反转(IOC)和依赖注入(DI)的原理,并提供了IOC的代码示例,阐述了Spring框架作为IOC容器的应用。
48 0
什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
|
3月前
|
XML Java 数据格式
Spring IOC容器的深度解析及实战应用
【10月更文挑战第14天】在软件工程中,随着系统规模的扩大,对象间的依赖关系变得越来越复杂,这导致了系统的高耦合度,增加了开发和维护的难度。为解决这一问题,Michael Mattson在1996年提出了IOC(Inversion of Control,控制反转)理论,旨在降低对象间的耦合度,提高系统的灵活性和可维护性。Spring框架正是基于这一理论,通过IOC容器实现了对象间的依赖注入和生命周期管理。
85 0