java Spring -如何在@Component类中@Autowire一个对象?

llmtgqce  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(208)

我正在创建一个2类库。主类(CustomLogger)将由我的应用程序使用。辅助类(LoggerConfig)用于从 CustomLogger 使用的.properties 文件导入一些字段。当我运行下面的代码时,我的自动连线配置对象保持为空。如有任何建议,我们将不胜感激。
CustomLogger.java:

@Component
public class CustomLogger {
    private String env;
    @Autowired
    private LoggerConfig myConfig;
    public CustomLogger() {
        this.env = myConfig.env;   // <-- getting null pointer exception here
    }
}
// ... public void methods here

LoggerConfig.java:

@Configuration
@ConfigurationProperties("logger")
public class LoggerConfig {
     public string env; // represented as 'logger.env' in properties
     public void setEnv(final String env) { this.env = env; }
     // ... other fields
}

Controller.java (使用库)

@RestController
public class Controller {
    @Autowired private CustomLogger customLogger;
// GET mappings
}
ha5z0ras

ha5z0ras1#

对于@Autowired注解,根据文档
字段是在bean构造之后,在调用任何配置方法之前注入的。这样的配置字段不必是公共的。
因此,对于属性自动装配,它将使用默认构造器创建类的对象,并且只有在创建对象后才会注入依赖项。因此,在CustomLogger的情况下,在对象创建期间,myConfig尚未注入,因此它为null,这会导致NPE。
这可以通过使用构造函数进行依赖注入来解决

@Component
public class CustomLogger {
    private final String env;
    private final LoggerConfig myConfig;
    @Autowired
    // Note : @Autowired is not really necessary for constructor autowiring in newer versions of spring
    public CustomLogger(LoggerConfig config) {
        this.myConfig = config;
        this.env = myConfig.env;  
    }
}

在这种情况下,对象与其依赖项一起创建

ibps3vxo

ibps3vxo2#

总结

问题可能是如何在Spring中建立一个自定义的自动连线属性配置?我认为你可以尝试按照下面的步骤,这可能会对你有帮助。

  1. 1.定义自定义属性类
  2. 1.添加配置文件additional-spring-configuration-metadata.json
  3. 1.将步骤1中定义的值与Spring属性关联
  4. 1.创建一个Configuration类,并将Bean连接到SpringContext中
1.定义自定义属性类
@Component
@ConfigurationProperties(prefix = "logger")
@Data
@Primary
public class LoggerConfig {
     public string env; // represented as 'logger.env' in properties
    // ... other fields
}
2.添加配置文件additional-spring-configuration-metadata.json

定义spring文件additional-spring-configuration-metadata.json,指示连接哪些属性的springContext;您应该将additional-spring-configuration-metadata.json添加到您的project path,即src/main/resources/META-INF/additional-spring-configuration-metadata.json以下是代码片段

{
  "groups": [
    {
      "name": "loggerConfig",
      "type": "com.statckoverflow.properties.LoggerConfig",
      "sourceType": "com.statckoverflow.properties.LoggerConfig",
    }
  ],
  "properties": [
   
    {
      "name": "logger.env",
      "type": "java.lang.String",
      "sourceType": "com.statckoverflow.properties.LoggerConfig",
      "description": "logger env."
    }
  ]
}
3.将步骤1中定义的值与Spring属性关联

checkout 你的spring yaml或properties路径,确保它在你的资源路径中,然后配置在前面步骤代码片段中定义的config

  • 属性
logger.env = develop
4.创建一个Configuration类,并将Bean连接到SpringContext中
@Configuration
@EnableConfigurationProperties({LoggerConfig.class})
@Slf4j
public class Config {
    @Bean
    private LoggerConfig applyLoggerConfig(@Autowired LoggerConfig config){
//  you can add some custom  configuration here 
       return config;
}

如果您没有更多的自定义配置,可以忽略步骤4,使用@Autowired来获取Bean,希望对您有所帮助;

相关问题