1

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

4

2 回答 2

2

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

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

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

于 2019-11-17T18:19:49.353 回答
1

对于初学者,@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 注释直接注入到您的 bean 中,通过 Spring 的 Environment 抽象访问,或者通过 @ConfigurationProperties 绑定到结构化对象。

于 2019-11-18T06:24:36.443 回答