Spring bean with placeholder создать второй боб с другим профилем - PullRequest
1 голос
/ 04 марта 2020

Предположим, что существует управляемый компонент Spring, подобный этому:

@Component
@Profile("prod")
public class MyBean {

    @Value("${x.y.id:-1}")
    private int id;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Кроме того, свойство x.y.id существует в файле application-prod.properties.

Теперь, если я хочу используйте тот же класс для создания другого управляемого компонента с другим профилем в классе конфигурации, подобном следующему:

@Profile("dev")
@Bean
public MyBean myBean() {
    MyBean myBean = new MyBean();
    myBean.setId(10);
    return myBean;
}

он не работает, так как поле id заканчивается значением -1, потому что значение по умолчанию заполнителя имеет последнее слово.

Вопрос Возможно ли иметь второй управляемый компонент в такой ситуации?


Добавление x.y.id=10 в application-dev.properties работает для описанного выше случая, но не для этого:

@Profile("dev")
@Bean
public MyBean myBean() {
    MyBean myBean = new MyBean();
    myBean.setId(10);
    return myBean;
}

@Profile("dev")
@Bean
public MyBean myAnotherBean() {
    MyBean myBean = new MyBean();
    myBean.setId(20);
    return myBean;
}

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Я не уверен, что такое "значение по умолчанию заполнителя имеет последнее слово ..."

Однако я думаю, что должно работать следующее:

Вы можете переписать MyBean класс так что он не будет использовать @Value и вообще будет использовать инжекцию конструктора:

public class MyBean {

    private final int id;

    public MyBean(int id) {this.id = id;}

    public int getId() {
        return id;
    }
}

В этом случае конфигурацию можно определить следующим образом:

@Configuration
@Profile("prod") // also possible to be used per bean
public class MyProductionConfiguration {

    @Bean
    public MyBean myBean( @Value("${x.y.id:-1}") int id) {
       return new MyBean(id);
    }
}

@Configuration
@Profile("dev")
public class MyDevConfiguration {

    @Bean
    public MyBean myBean() {
       return new MyBean(10);
    }
}

0 голосов
/ 04 марта 2020

Чтобы сохранить вещи однородными , вы можете просто воспользоваться файлом application-dev.properties и установить его свойство там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...