Spring-boot 1.4.1 Разница между зависимостями внедрения @Resource и @Autowired

У меня есть пружинный загрузочный бин, который является прокси-объектом для динамического объекта источника данных.

@Bean("schemaSwappableDataSource")
public ProxyFactoryBean schemaSwappableDataSource(@Autowired @Qualifier("schemaSwappableDataSourceProxy") SchemaSwappableDataSourceProxy schemaSwappableDataSourceProxy){
    try {
        ProxyFactoryBean bean = new ProxyFactoryBean();
        Class<?>[] classList = {javax.sql.DataSource.class};
        bean.setProxyInterfaces(classList);
        bean.setTargetSource(schemaSwappableDataSourceProxy);
        //return (DataSource)bean.getObject();
        return bean;
    }catch(Exception e){
        e.printStackTrace();
        return null;
    }
}

Когда я пытаюсь внедрить этот компонент с помощью @Autowired, во время выполнения я получаю ошибку ниже.

@Autowired
@Qualifier("schemaSwappableDataSource")
DataSource schemaSwappableDataSource;

Eroor сообщение

11:39:24.238 - WARN  - [SpringApplicationRunListeners.java:91] - Error handling failed (Error creating bean with name 'delegatingApplicationListener' defined in org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.config.internalTransactionAdvisor' defined in class path resource [org/springframework/transaction/annotation/ProxyTransactionManagementConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor]: Factory method 'transactionAdvisor' threw exception; nested exception is java.lang.NullPointerException)
11:39:24.410 - ERROR - [LoggingFailureAnalysisReporter.java:42] - 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field schemaSwappableDataSource in com.siemens.rcs.dc.comment.dao.impl.CommentDAOImpl required a bean of type 'javax.sql.DataSource' that could not be found.
    - Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.type) did not find property 'spring.datasource.type'
    - Bean method 'dataSource' not loaded because @ConditionalOnProperty (spring.datasource.jndi-name) did not find property 'jndi-name'
    - Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required class 'javax.transaction.TransactionManager'


Action:

Consider revisiting the conditions above or defining a bean of type 'javax.sql.DataSource' in your configuration.

Но если я использую

@Resource(name="schemaSwappableDataSource")
DataSource schemaSwappableDataSource;

Работает нормально.... Может кто-нибудь сказать мне, что я делаю неправильно, и что может быть лучшим способом использования bean-компонента ProxyFactory в таком сценарии? Мне нужно создавать объекты источника данных во время выполнения, потому что источник данных динамически должен подключаться к различным типам баз данных на основе переданных параметров. Ему не нужно каждый раз создавать новый источник данных, поскольку после его создания он сохраняется в статической карте и извлекает их на основе локальной переменной потока. Любая помощь, лучшие практики, пожалуйста, совет.

1 ответ

Спасибо всем, это работало с простой кастой.

@Bean("schemaSwappableDataSource")
public DataSource schemaSwappableDataSource(@Autowired @Qualifier("schemaSwappableDataSourceProxy") SchemaSwappableDataSourceProxy schemaSwappableDataSourceProxy) throws ClassNotFoundException{
        ProxyFactoryBean bean = new ProxyFactoryBean();
        Class<?>[] classList = {javax.sql.DataSource.class};
        bean.setProxyInterfaces(classList);
        bean.setTargetSource(schemaSwappableDataSourceProxy);
        return javax.sql.DataSource.class.cast(bean.getObject());
}

@Bean("schemaSwappableJdbcTemplate")
public JdbcTemplate schemaSwappableJdbcTemplate(@Qualifier("schemaSwappableDataSource") DataSource schemaSwappableDataSource) {
    return new JdbcTemplate(schemaSwappableDataSource);
}

@Bean("schemaSwappableTxManager")
public DataSourceTransactionManager schemaSwappableTxManager(@Qualifier("schemaSwappableDataSource") DataSource schemaSwappableDataSource){
    DataSourceTransactionManager txMgr = new DataSourceTransactionManager();
    txMgr.setDataSource(schemaSwappableDataSource);
    return txMgr;
}

возникли проблемы с объединением двух аннотаций - пользовательской @SchemaSelector <- custom & @Transactional <-, предоставленной Spring. Но удалось решить это с помощью интерфейса org.springframework.core.Ordered.

Другие вопросы по тегам