BeanFactoryPostProcessor
s - это особый вид концепции весной. Это компоненты, которые работают с экземплярами BeanDefinition
, которые являются метамоделью экземпляров bean-компонентов , который будет создан.
Это означает, что в момент, когда вызывается BFPP
s, экземпляры bean-компонента еще не созданы, так как метамодель должна быть обработана после обработки (как следует из названия). Следовательно, бобы, зависящие от BFPP
, будут инициализированы чрезвычайно в начале жизненного цикла контейнера. Таким образом, настоятельно рекомендуется не зависеть от компонентов приложения от BFPP
s или - если это действительно необходимо - только на компонентах, которые не обязательно запускают создание множества компонентов ниже по потоку.
При этом вы не должны зависеть от особенно репозиториев от BFPP
, так как они обычно требуют создания множества компонентов инфраструктуры. Я бы рекомендовал получить свойства конфигурации, необходимые для подключения к базе данных конфигурации (URL-адрес JDBC, имя пользователя, пароль и т. Д.), И просто создайте бросок DataSource
, который используется только для создания нового BeanDefinition
для нового DataSource
, который собирается для использования в конечном итоге.
Так вот рекомендуемые шаги (от верхней части головы - может понадобиться некоторые настройки):
- падение автоматического связывания в виде
DataSource
- настроить
@PropertySource
указывает на свойства, содержащие координаты в подключить
вводить значения этого PropertySource
в конструктор BFPP
:
class YourBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public YourBeanFactoryPostProcessor(@Value("#{properties.url}) String url, …) {
// assign to fields
}
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
// 1. Create throw-away DataSource
// 2. Create JdbcTemplate
// 3. Use template to lookup configuration properties
// 4. Create BeanDefinition for DataSource using properties just read
// 5. Register BeanDefinition with the BeanFactory
}
}