从属性文件读取springboot问题

时间:2019-11-17 18:15:11

标签: spring-boot spring-properties

我正在尝试读取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才能从属性文件读取吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

对于初学者,不建议使用@Value将属性值直接注入所需的类,因为这会降低可维护性。随着注入值数量的增加,很难跟踪它们。最好使用AppConfiguration类将这些值映射到初始位置。这意味着您可以将所有配置都放在一个地方,以后再在任何需要的地方使用它。

正如@fap所说,要使用@Value批注从yml / property自动接线或注入值,该类的bean创建需要由Spring进行管理。甚至在您的Util类中尽管您正在自动装配Bean,并使用@Value批注注入defaultTimeFormat的值,但是您没有提供spring控件来为类创建Bean。

Spring在bean创建阶段处理依赖项注入,因此由于未向spring提供该控件,因此无法解析该值。您可以做的是使用@Component注释或@Bean注释为Util类创建一个bean,这样spring可以像下面这样控制Bean的创建:

方法1:

@Configuration
class GeneralConfiguration {

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

}

或像@fab一样,建议使用@Component批注,以便spring自动为您的Util类创建一个bean:

方法2:

@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批注的定型专业化,这是为什么对您有用。

  

可以使用以下属性将属性值直接注入到您的bean中:   通过Spring的环境抽象访问的@Value注释,   或通过@ConfigurationProperties绑定到结构化对象。