SpringBoot探索04 – Java Headless Mode

引入

在springboot的启动代码中看到了下面这一句:

 private void configureHeadlessProperty() {
 System.setProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS,
 System.getProperty(SYSTEM_PROPERTY_JAVA_AWT_HEADLESS, Boolean.toString(this.headless)));
 }

先不谈这段代码的作用,只说这里的写法就有很多可以借鉴的地方:

  1. 定义了有意义的常量
  2. 在set之前先get以避免覆盖用户自定义配置
  3. 允许用户在程序中配置headless项,所以有了

    this
    .
    headless


    变量


  4. Boolean
    .
    toString


    这样的写法也是极好的,起到了规范统一的作用

从spring的代码中就可以看到设计者对我们这些普通Developer的友好。
忽略掉这些有价值(但有可能显得啰嗦)的内容,可以提炼出这行代码:

System.setProperty("java.awt.headless", "true");

这行代码的作用是:声明当前应用使用 headless
模式。

说明

Headless模式是应用的一种配置模式。在服务器可能缺少显示设备、键盘、鼠标等外设的情况下可以使用这种模式。

java.awt.toolkit
java.awt.graphicsenvironment
类中的很多方法,除了对字体、图形和打印的操作外还需要调用显示器、键盘和鼠标等设备。但是有一些类,比如

Canvas




Panel


,是可以在headless模式下执行的。
在headless模式下,(awt)应用程序可以执行如下操作:

  1. 创建轻量级组件
  2. 收集关于可用的字体、字体指标和字体设置的信息
  3. 设置颜色来渲染准备图片
  4. 创造和获取图像,为渲染准备图片
  5. 使用java.awt.PrintJob,java.awt.print.*,和javax.print.*类里的打印操作

简单来说,headless模式是一种声明:现在不要指望硬件的支持了,只能使用系统的运算能力来做些非可视化的处理工作。
除此之外,应该是没有其他作用了。

重点

关于这个配置在性能上的影响:

  1. 如果应用不需要任何 head
    ,那么有无这个配置没有任何影响;
  2. 如果应用有弹出窗口之类的操作,那么在 headless
    模式下这种操作会被阻止。

总之,这是一项提示类的配置。

参考

End!