【问题标题】:springboot issues reading from properties filespringboot 问题从属性文件中读取
【发布时间】:2019-11-17 18:15:11
【问题描述】:

我正在尝试读取 Util 类中的属性值。 我试过Environment@Value。但它为这些字段获得了Null 值。

@SpringBootApplication
@EnableJpaAuditing
public class EmployeeApplication {

    @PostConstruct
    private void init() {
        System.out.println("AppInitializator initialization logic ...");
        new Util().getTime();
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(EmployeeApplication.class, args);
    }
}

public class Util {

    @Autowired
    private Environment env;

    @Value("${defaultTimeFormat}")
    private String defaultTimeFormat;

    public void getTime(){
        System.out.println(defaultTimeFormat);
        System.out.println(env.getProperty("defaultTimeFormat"));
        // method logic here
    }
}

我通过将 Util 设置为 @Service 类并将其依赖项注入到 EmployeeApplication 中来解决了这个问题,如下所示。

@SpringBootApplication
@EnableJpaAuditing
public class EmployeeApplication {
    @Autowired
    Util util;

    @PostConstruct
    private void init() {
        System.out.println("AppInitializator initialization logic ...");
        util.getTime();
    }

    public static void main(String[] args) throws Exception {
        SpringApplication.run(EmployeeApplication.class, args);
    }
}


@Service
public class Util {

    @Autowired
    private Environment env;

    @Value("${defaultTimeFormat}")
    private String defaultTimeFormat;

    public void getTime(){
        System.out.println(defaultTimeFormat);
        System.out.println(env.getProperty("defaultTimeFormat"));
        // method logic here
    }
}

但是spring-boot 中的方法是否正确?我是否需要将其设为Service/Component/Repository 才能从属性文件中读取?

【问题讨论】:

    标签: spring-boot spring-properties


    【解决方案1】:

    是的,您需要使用 @Component 或其他注释之一对类进行注释,以便 Spring Boot 将其实例化。

    只有生命周期由 Spring 控制的对象才能获得由 Spring 注入的值,如果添加 @Value 注释就会发生这种情况。

    在应用程序启动期间,Spring 使用您已注释的类的单例实例填充应用程序上下文。 只有这些类会获得通过@Autowired@Value 注入的值。

    【讨论】:

      【解决方案2】:

      对于初学者,不鼓励使用@Value 将属性值直接注入所需的类,因为它会降低可维护性。随着注入值的数量增加,跟踪它们变得困难。而是使用 AppConfiguration 类将这些值映射到最初是值得赞赏的。这意味着您可以在一个地方累积所有配置,然后在以后需要时在代码中使用它。

      正如@fap 所说,为了使用 @Value 注释从 yml/property 自动装配或注入一个值,该类的 bean 创建需要由 Spring 管理。在你的 Util 类中,即使你正在自动装配bean 并使用@Value 注释注入defaultTimeFormat 的值,您没有提供spring 控件来为类创建bean。

      Spring 在 bean 创建阶段处理依赖注入,因此由于没有向 spring 提供该控制,因此该值没有得到解决。您可以做的是使用 @Component 注释或 @Bean 注释为 Util 类创建一个 bean,以便 spring 控制 bean 创建,如:

      方法一:

      @Configuration
      class GeneralConfiguration {
      
      @Bean
      public Util returnUtilBean() {
        return new Util();
      }
      
      }
      

      或者像@fab 建议的那样使用@Component 注解,这样spring 会自动为你的Util 类创建一个bean:

      方法二:

      @Component
      public class Util {
      
          @Autowired
          private Environment env;
      
          @Value("${defaultTimeFormat}")
          private String defaultTimeFormat;
      
          public void getTime(){
              System.out.println(defaultTimeFormat);
              System.out.println(env.getProperty("defaultTimeFormat"));
              // method logic here
          }
      }
      

      @Service 注释是@Component 注释的刻板特化,这就是它适合您的原因。

      属性值可以通过使用 @Value 注解,通过 Spring 的 Environment 抽象访问, 或通过@ConfigurationProperties 绑定到结构化对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-14
        • 2020-12-04
        • 1970-01-01
        • 1970-01-01
        • 2019-10-04
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多