Корректно ли при создании Bean обращаться к базе данных?

Рейтинг: 0Ответов: 1Опубликовано: 10.07.2023

Конфигурация оборудования хранится в базе данных. Корректно ли делать в конфигурации метод, который возвращает Bean, сконфигурированный из данных, полученных из базы данных? Или лучше не использовать Bean и создавать такие объекты в коде? Или есть другой вариант?

Пример:

@Configuration
public class ProtocolConfig {
    private final List<DecisionPointModel> decisionPointModels;
    String deviceAddress;

    public ProtocolConfig(DecisionPointRepository decisionPointRepository) {
        decisionPointModels = decisionPointRepository.findAll();
        Optional<DecisionPointModel> dpm = decisionPointModels.stream().findFirst();
        dpm.ifPresent(decisionPointModel -> deviceAddress = decisionPointModel.getControllerParameterModel().getDevice().getDeviceAddress());
    }

    @Bean
    public S7ProtocolMultiWrite multiResponseBean() {
        if (decisionPointModels.size() > 0) {
            int responseDb = S7Protocol.parseConnectionString(decisionPointModels.get(0).getControllerParameterModel().getCommandConnectionString()).getDb();
            Long countResponse = decisionPointModels.stream().count() * PlcResponseDataBlock.byteLength;
            return new S7ProtocolMultiWrite(deviceAddress, responseDb, countResponse.intValue());
        } else {
            throw new BeanCreationException("Error Creating multiResponseBean");
        }
    }

    @Bean(name = "arriveReadBean")
    public S7ProtocolMultiRead multiArriveBean() {
        if (decisionPointModels.size() > 0) {
            int arriveDb = S7Protocol.parseConnectionString(decisionPointModels.get(0).getControllerParameterModel().getArriveConnectionString()).getDb();
            Long countArrive = decisionPointModels.stream().count() * PlcRequestDataBlock.byteLength;
            return new S7ProtocolMultiRead(deviceAddress, arriveDb, countArrive.intValue());
        } else {
            throw new BeanCreationException("Error Creating multiArriveBean");
        }
    }

}

Ответы

▲ 0

Корректно ли делать в конфигурации метод, который возвращает Bean, сконфигурированный из данных, полученных из базы данных?

Если не смущает увеличение времени инициализации контекста - то почему бы и нет. В противном случае эти бины должны сами себя конфигурировать по первому запросу или после события инициализации контекста.

Или лучше не использовать Bean и создавать такие объекты в коде?

Фреймворк предоставляет возможность создания синглтонов (в частности хранящих immutable конфигурацию) и имхо их использование является приоритетней классических.

Или есть другой вариант?

Только если приложению необходимо адекватно реагировать на изменение конфигурации. Но это уже совсем другая история.