我正在尝试读取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
才能从属性文件读取吗?
答案 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绑定到结构化对象。