基于活动轮廓自动装配不同参数的方法

时间:2018-04-23 19:30:00

标签: java spring

使用Spring Boot,我有一个自动装配的方法,如果活动配置文件是本地的,我想从属性文件中传入两个变量,但是如果它是dev / prod我只想传入一个变量(端点是由于环境的自动配置而需要。

这不起作用,因为spring不知道自动装配哪种方法。我已经玩过添加(required = true / false),无论我如何配置所需,它仍然会抛出错误。有没有更好的方法来添加可选的基于配置文件的参数值?

/* * * * * * * * * * * * * * * * * 
application-local.properties

company.group.endpoint=http://localhost:8000/
company.group.version=/v2
* * * * * * * * * * * * * * * * *
application-dev.properties

company.group.version=/v3
* * * * * * * * * * * * * * * * *
*/

// Worker.java

@Component
public class Worker {
    private String endpoint;
    private String version;

    @Autowired
    public Worker(@Value("${company.group.version}") String version) {
        this.version = version;
        // do work
    }

    @Autowired
    public Worker(@Value("${company.group.version}") String version, 
                  @Value("${company.group.endpoint}") String endpoint) {
        this.version = version;
        this.endpoint = endpoint;
        // do work
    }
}

2 个答案:

答案 0 :(得分:2)

使用可注入bean重载构造函数并不像pojo类那样简单 确实,Spring并不知道应该调用哪个构造函数。

因此,另一种方法是使用单个自动装配的构造函数 您可以通过指定默认值(例如null

)使其中一个参数成为可选参数
@Autowired
public Worker(@Value("${company.group.version}") String version, 
              @Value("${company.group.endpoint:#{null}}") String endpoint) {
    this.version = version;
    this.endpoint = endpoint;
    // do work
}

答案 1 :(得分:1)

仅使用一个构造函数,并将可选参数移动到字段中。按照惯例,您可以分离出该组件必须存在的参数,以及可选的参数,使您的代码更容易测试和维护。

@Component
public class Worker {
    @Value("${company.group.endpoint:@null}")
    private String endpoint;
    private String version;

    @Autowired
    public Worker(@Value("${company.group.version}") String version) {
        this.version = version;
        // do work
    }
}