提问人:user2999870 提问时间:3/8/2023 更新时间:3/8/2023 访问量:789
Spring - 如何在@Component类中@Autowire对象?
Spring - How can I @Autowire an object inside a @Component class?
问:
我正在创建一个 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
}
答:
用于根据文档进行注释@Autowired
在构造 Bean 之后,在调用任何配置方法之前,立即注入字段。这样的配置字段不必是公共的。 自动连线方法。
因此,对于属性自动连接,它将使用默认的 consructor 创建类的对象,并且只有在创建对象后才会注入依赖项。因此,在您的情况下,在对象创建期间,尚未注入,因此它是 null,这会导致 NPE。CustomLogger
myConfig
这可以通过使用构造函数进行依赖注入来解决
@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;
}
}
在这种情况下,将创建对象及其依赖项
总结
问题可能是如何在 ?
我认为您可以尝试按照以下步骤操作,这可能对您有所帮助。Spring
-
- 定义自定义属性类
-
- 添加配置文件
additional-spring-configuration-metadata.json
- 添加配置文件
-
- 将您在步骤 1 中定义的值与 spring 属性连接起来
-
- 创建一个 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.json
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 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
评论