【问题标题】:SpringBoot reads all properties as 0Spring Boot 将所有属性读取为 0
【发布时间】:2018-08-20 19:51:22
【问题描述】:

使用 SpringBoot,我有一个简单的类

@Component
@PropertySource("server.properties")
public class CoreFacade {
    private static final Logger log = Logger.getLogger(CoreFacade.class);

    @Value("${chat.server.port}")
    private int port;
    private Server server;

    public CoreFacade() {
        log.info(String.valueOf(port));
        server = new Server(port);
    }
}

在 src/main/resources 下我得到了 server.properties chat.server.port = 9999

然而,记录这最终会得到

信息 2018-08-20 21:48:02,878 [主要] com.example.chatserver.core.CoreFacade [] [] - 0

而不是 9999

有什么想法可能在这里出错吗?

【问题讨论】:

  • 当然会。您正在将其记录在构造函数中,@Value 将在之后被解析。

标签: spring spring-boot properties


【解决方案1】:

您将类注释为 Spring 组件。
它打印0,因为构造函数是由 Spring 在为 bean 完成任何依赖注入之前调用的。
您需要将类声明为配置类,例如:

@Configuration
@PropertySource("server.properties")
public class CoreFacade {
 ...
}

如果有意义,您可以将 Server 定义为类中定义的 bean,例如:

@Value("${chat.server.port}")
private int port;

@Bean
public Server server() {
     return new Server(port); 
}

【讨论】:

  • 其实,单独使用@Configuration 是不够的,我还得使用@Bean。但是,如果我错了,请纠正我,每次我都会使用getServer() 我会以这种方式获得Server 的新实例?如果我不想那样,唯一的办法就是@Bean public Server server() { this.server = new Server(port); return null; } ?
  • 无论您调用该方法的次数如何,都不会使用 @Bean 注释的方法创建一次 bean。但是,如果您指定了原型范围。 @Bean 不应该是课堂所必需的。
【解决方案2】:

davidxxx 提出的另一种解决方案是将构造函数标记为 @Autowired :

@Component
@PropertySource("server.properties")
public class CoreFacade {
    private static final Logger log = Logger.getLogger(CoreFacade.class);

    private Server server;

    @Autowired
    public CoreFacade(
        @Value("${chat.server.port}")
        int port
    ) {
        log.info(String.valueOf(port));
        server = new Server(port);
    }
}

您也可以使用@PostConstruct,它在@Value 解析之后调用:

@Component
@PropertySource("server.properties")
public class CoreFacade {
    private static final Logger log = Logger.getLogger(CoreFacade.class);

    @Value("${chat.server.port}")
    private int port;
    private Server server;

    @PostConstruct
    public void postConstruct() {
        log.info(String.valueOf(port));
        server = new Server(port);
    }
}

【讨论】:

    猜你喜欢
    • 2019-05-18
    • 1970-01-01
    • 2016-04-29
    • 1970-01-01
    • 2017-09-07
    • 2021-03-05
    • 2018-10-16
    • 2020-02-14
    • 2015-11-13
    相关资源
    最近更新 更多