Spring boot 从属性文件读取springboot问题

Spring boot 从属性文件读取springboot问题,spring-boot,spring-properties,Spring Boot,Spring Properties,我试图读取Util类中的属性值。 我尝试了环境和@Value。但这些字段的值为空 @SpringBootApplication @EnableJpaAuditing public class EmployeeApplication { @PostConstruct private void init() { System.out.println("AppInitializator initialization logic ..."); new U

我试图读取Util类中的属性值。 我尝试了环境和@Value。但这些字段的值为空

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

但是,在春季开机正确的方式吗?我是否需要使其成为服务/组件/存储库来读取属性文件?

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

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

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

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

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

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

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

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

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

方法1:

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

方法2:

@Service注释是@Component注释的一个定型专门化,这就是为什么它对您有效

属性值可以通过使用 @通过Spring的环境抽象访问的值注释, 或者通过@ConfigurationProperties绑定到结构化对象

首先,不鼓励使用@Value直接将属性值注入所需的类,因为这会降低可维护性。随着注入值数量的增加,很难跟踪它们。相反,使用AppConfiguration类将这些值映射到一开始是值得赞赏的。这意味着您可以在一个地方累积所有配置,并在以后需要时在代码中使用它

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

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

方法1:

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

方法2:

@Service注释是@Component注释的一个定型专门化,这就是为什么它对您有效

属性值可以通过使用 @通过Spring的环境抽象访问的值注释, 或者通过@ConfigurationProperties绑定到结构化对象

@Configuration
class GeneralConfiguration {

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

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