具有类prameter的@EnableAutoConfiguration注释未初始化属性对象

时间:2018-12-18 11:39:45

标签: spring spring-boot

我有@CongfigurationProperties类

//@Component
@ConfigurationProperties
@PropertySource("classpath:typesofcharge.properties")
public class ChargeProperties {
    private HashMap<String,String> charge=new HashMap<>();
    public HashMap<String,String> getCharge()
    {
        return this.charge;
    }

}

这是我的配置文件

@SpringBootApplication
@ComponentScan({"com.vehiclemanagement.config,com.vehiclemanagement.client,"
        + "com.vehiclemanagement.controller,"
        + "com.vehiclemanagement.exception,"
        + "com.vehiclemanagement.model,"
        + "com.vehiclemanagement.service"})
@EnableConfigurationProperties(ChargeProperties.class)
public class VehicleManagementConfig {


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

}

如果我在ChargeProperties中使用@Component批注并在Configuration类中删除ChargeProperties.class批注,则会正确初始化Charge HashMap

如果我删除@Component并传递ChargeProperties.class作为这样的参数 @EnableConfigurationProperties(ChargeProperties.class)就像文档说的那样,当我运行时,费用HashMap为空

我正在使用Spring Boot 2.0.2版本。但是,我正在关注最新文档。谁能解释为什么这不能按照文件建议的方式进行

属性文件的内容如下

更新属性文件的内容如图所示

#DO NOT MODIFY THIS FILE
charge.peak=Double_rate;
charge.lateNight=duration_based_charge;
charge.earlyMorning=special_offers;

2 个答案:

答案 0 :(得分:1)

ChargeProperies.class注释上指定@EnableConfigurationProperties时,它将通过EnableConfigurationPropertiesImportSelector内的@EnableConfigurationProperties类注册为bean。

因此,在此示例中,如果仅用ChargeProperties注释了@ConfigurationProperties类,它将创建一个chargeProperties且带有空电荷HashMap的bean,因为它默认返回到以application.properties为源。

可以使用@PropertySource指定自定义来源。

  

@PropertySource批注提供了一种方便的声明性机制来添加   Spring环境的PropertySource。结合使用   使用@Configuration类。

根据上面的文档,要使用@PropertySource加载自定义源,必须使用@Configuration批注。

@Configuration
@PropertySource("classpath:typesofcharge.properties")

在内部,@Configuration类是@Component

@Target(value=TYPE)
 @Retention(value=RUNTIME)
 @Documented
 @Component
public @interface Configuration

对您的问题。通过指定不带@PropertySource的自定义@Configuration,spring不会在@PropertySource批注中加载属性,并且默认返回给application.properties。

答案 1 :(得分:0)

如果使用@PropertySource,则必须使用component,否则将无法读取属性

因为我们添加了@ComponentScan,所以我们根本不必提及@EnableConfiguationProperties批注。propety类对象可以自动装配为Bean