Java 为什么ConfigurationProperties类中的嵌套类需要是静态的?
我使用Java 为什么ConfigurationProperties类中的嵌套类需要是静态的?,java,spring,spring-boot,Java,Spring,Spring Boot,我使用application.yml文件作为spring boot应用程序中的外部配置,该应用程序使用@ConfigurationProperties注释绑定到AppConfig.java。在AppConfig.java中,我有基于application.yml中层次结构的嵌套类。当我使用static声明嵌套类时,一切正常。但最近在一个项目中,我错过了其中一个嵌套类的静态,这导致了NullPointerException。通过在线资源,我阅读了何时以及何时不使嵌套类保持静态。但是,我需要了解ap
application.yml
文件作为spring boot应用程序中的外部配置,该应用程序使用@ConfigurationProperties
注释绑定到AppConfig.java
。在AppConfig.java
中,我有基于application.yml
中层次结构的嵌套类。当我使用static
声明嵌套类时,一切正常。但最近在一个项目中,我错过了其中一个嵌套类的静态
,这导致了NullPointerException
。通过在线资源,我阅读了何时以及何时不使嵌套类保持静态。但是,我需要了解application.yml
和AppConfig.java
的绑定是如何在spring boot中发生的,以及为什么嵌套类需要是静态的
application.yml
AppConfig.java
当我在其他类中自动连接AppConfig.java
时,AppConfig.getFoo()
工作正常,但是AppConfig.getBar()
会导致NullPointerException
我不知道为什么它必须是静态的。
但是,我在文档中找到了其他注释。它与@ConfigurationProperties bean的验证有关。
这是:
配置属性验证器是在应用程序生命周期的早期创建的,将@Bean方法声明为static可以创建Bean,而无需实例化@configuration类
这是关于内部阶级的。
更多详细信息:Spring正在使用绑定器将属性应用于ConfigurationProperty bean
如果getX()不返回类,Spring使用的绑定器可以创建实例。但是,这仅限于简单的构造函数。类不是静态的,只能通过引用包含它的实例来实例化
如果这是您真正需要的,那么您可以在bean创建期间创建该类的实例
@Component
@ConfigurationProperties("spring")
public class AppConfig {
private Foo foo = new Foo();
private Bar bar = new Bar();
public static class Foo {
private String host;
// getter, setter
}
public class Bar {
private String host;
// getter, setter
}
//getters, setters
}
这只是猜测,但可能spring在创建非静态内部类实例时遇到了困难,因为在实例化非静态内部类时必须提供对封闭实例的引用。不过,让它保持静态应该不是什么大问题。或者,您可以让它成为非静态的,并使其成为同一个类中的非公共类。java如果您查看NPE
的堆栈跟踪,您可以很容易地找到抛出它的原因。感谢您指出这一点,这与为什么要首先使用静态嵌套类是一致的。但是,文档中还指出,这样做可以避免早期实例化可能导致的任何问题。知道这些问题是什么吗?谢谢,我现在明白了!可以实例化嵌套类,而无需实例化@ConfigurationProperties
类。我现在不明白的是,上面答案中给出的spring文档提到了,这样做可以避免早期实例化可能导致的任何问题。我想不出会出现什么问题!
@Component
@ConfigurationProperties("spring")
public class AppConfig {
private Foo foo;
private Bar bar;
public static class Foo {
private String host;
// getter, setter
}
public class Bar {
private String host;
// getter, setter
}
//getters, setters
}
@Component
@ConfigurationProperties("spring")
public class AppConfig {
private Foo foo = new Foo();
private Bar bar = new Bar();
public static class Foo {
private String host;
// getter, setter
}
public class Bar {
private String host;
// getter, setter
}
//getters, setters
}