2014-10-06 3 views
2

Я работаю над проектом с использованием Spring Data JPA (на Tomcat 7). Я реализую BeanFactoryPostProcessor для динамического создания DataSource. Но проблема в том, что моя информация DataSource (имя, адрес и т. Д.) Хранится в самой базе данных.Как подключиться к базе данных внутри BeanFactoryPostProcessor?

@Component 
class DatasourceRegisteringBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 

    // This doesn't work 
    @Autowired DatabaseService databaseService; 

    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { 
    // my code here ... 
    // ... 
    } 
} 

Как вы можете видеть, я пытался внедрить услугу, которая может получить мне список всех DataSource с моего базы данных, но он не работает. В любом случае, чтобы подключиться к базе данных и получить этот список в классе BeanFactoryPostProcessor? Любое другое обходное решение будет приветствоваться. :)

ответ

0

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 
        } 
    } 
    
Смежные вопросы