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

Spring - How can I @Autowire an object inside a @Component class?

提问人:user2999870 提问时间:3/8/2023 更新时间:3/8/2023 访问量:789

问:

我正在创建一个 2 类库。主类 (CustomLogger) 将由我的应用程序使用。帮助程序类 (LoggerConfig) 用于从 .CustomLogger 使用的属性文件。当我运行下面的代码时,我的 Autowired 配置对象保持 null。任何建议将不胜感激。

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
}

控制器 .java(使用库)

@RestController
public class Controller {
    @Autowired private CustomLogger customLogger;
// GET mappings
}
Java Spring NullPointerException

评论


答:

2赞 josephjacobmorris 3/8/2023 #1

用于根据文档进行注释@Autowired

在构造 Bean 之后,在调用任何配置方法之前,立即注入字段。这样的配置字段不必是公共的。 自动连线方法。

因此,对于属性自动连接,它将使用默认的 consructor 创建类的对象,并且只有在创建对象后才会注入依赖项。因此,在您的情况下,在对象创建期间,尚未注入,因此它是 null,这会导致 NPE。CustomLoggermyConfig

这可以通过使用构造函数进行依赖注入来解决

@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;  
    }
}

在这种情况下,将创建对象及其依赖项

-1赞 Peng 3/8/2023 #2

总结

问题可能是如何在 ? 我认为您可以尝试按照以下步骤操作,这可能对您有所帮助。Spring

    1. 定义自定义属性类
    1. 添加配置文件additional-spring-configuration-metadata.json
    1. 将您在步骤 1 中定义的值与 spring 属性连接起来
    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文件以指示springContext应该连接哪些属性;您应该将 d 添加到您的下面是代码片段additional-spring-configuration-metadata.jsonadditional-spring-configuration-metadata.jsonproject 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 yaml或properties路径,确保它位于你的资源路径中,然后配置在上一步中定义的配置 代码片段

  • 性能
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;
}

如果你没有更多的自定义配置,就忽略step4,使用获取Bean。 希望对您有所帮助;@Autowired