Parameter 0 of constructor in work.dao.impl.SqlDaoImpl required a bean of type 'org.springframework.

Parameter 0 of constructor in work.dao.impl.SqlDaoImpl required a bean of type 'org.springframework.jdbc.core.JdbcTemplate' that could not be found.
- Bean method 'jdbcTemplate' in 'JdbcTemplateAutoConfiguration' not loaded because @ConditionalOnMissingBean (types: org.springframework.jdbc.core.JdbcOperations; SearchStrategy: all) found beans 'jdbcTemplateOnlyRead', 'jdbcTemplateAdminSelf', 'jdbcTemplateHistoryWrite', 'jdbcTemplateWriteMysql', 'jdbcTemplateRead', 'jdbcTemplateReadMysql', 'jdbcTemplateHistoryRead', 'jdbcTemplateWrite'

JdbcTemplateAutoConfiguration中的方法jdbcTemplate加载失败,找到JdbcTemplateAutoConfiguration这个类:

@Configuration
@ConditionalOnClass({DataSource.class, JdbcTemplate.class})
@ConditionalOnSingleCandidate(DataSource.class)
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class JdbcTemplateAutoConfiguration {
    private final DataSource dataSource;

    public JdbcTemplateAutoConfiguration(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    @Bean
    @Primary
    @ConditionalOnMissingBean({JdbcOperations.class})
    public JdbcTemplate jdbcTemplate() {
        return new JdbcTemplate(this.dataSource);
    }

会发现在jdbcTemplate方法上有个@ConditionalOnMissingBean的注释,这个注释其实说的是当存在JdbcOperations这个类的对象时就跳过这个方法,所以会造成jdbcTemplate加载失败.

原因是因为在applicationContext.xml中配置了



去掉这个bean,重新再其他地方进行配置org.springframework.jdbc.core.JdbcTemplate,比如我自己写了一个加载配置文件的类,并在配置类中进行配置

@Configuration
@ImportResource("classpath:application-context.xml")
public class ConfigClass {
    @Bean("jdbcTemplateWrite")
    public JdbcTemplate jdbcTemplateWrite(@Qualifier("dataSourceWrite")DataSource dataSource){
        JdbcTemplate jdbcTemplate=new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource);
        return jdbcTemplate;
    }

就可以解决这个问题了。.

你可能感兴趣的:(java)