首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么自动装配jdbctemplate会导致循环依赖?

为什么自动装配jdbctemplate会导致循环依赖?
EN

Stack Overflow用户
提问于 2017-04-23 09:20:40
回答 1查看 886关注 0票数 1

下面的代码会产生循环依赖错误。

代码语言:javascript
运行
复制
   @Controller
    public class Controllers {

        @Autowired
        JdbcTemplate jdbcTemplate;

        @RequestMapping(value = "/", method = {RequestMethod.GET, RequestMethod.POST})
        @ResponseBody
        public String map(){
            String sql = "INSERT INTO persons " +
                    "(id, name, surname) VALUES (?, ?, ?)";
            Connection conn = null;
            jdbcTemplate.execute("INSERT INTO persons (id, name, surname) VALUES (1, \'Name\', \'Surname\')");

            return "";
        }

        @Bean
        @Primary
        public DataSource dataSource() {
            return DataSourceBuilder
                    .create()
                    .username("root")
                    .password("root")
                    .url("jdbc:mysql://localhost:3306/people")
                    .driverClassName("com.mysql.jdbc.Driver")
                    .build();
        }


The dependencies of some of the beans in the application context form a cycle:

|  org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration
↑     ↓
|  controllers (field org.springframework.jdbc.core.JdbcTemplate controllers.Controllers.jdbcTemplate)
↑     ↓
|  org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration
↑     ↓
|  dataSource
└─────┘

但是,如果我不自动创建jdbctemplate模板并正常初始化它。

代码语言:javascript
运行
复制
jdbcTemplate = new JdbcTemplate(dataSource());

则不会产生任何错误。

我有以下的gradle依赖关系:

代码语言:javascript
运行
复制
dependencies {
    compile("org.springframework.boot:spring-boot-starter-web:1.5.3.RELEASE")
     compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: '1.5.2.RELEASE'
   compile(group: 'mysql', name: 'mysql-connector-java', version: '6.0.6')
    testCompile group: 'junit', name: 'junit', version: '4.12'

}

循环依赖背后的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-23 09:39:27

您有一个循环依赖关系,因为JdbcTemplate需要一个DataSource,但是为了创建DataSource,需要一个Controllers实例,但是因为需要一个JdbcTemplate,所以不能构造它(因为循环依赖)。

您正在使用Spring,但显然您正在努力避免。删除DataSourceDataSource方法,并将以下内容添加到application.properties中。

代码语言:javascript
运行
复制
spring.datasource.url=jdbc:mysql://localhost:3306/people
spring.datasource.username=root
spring.datasource.password=root

有了这个春季,引导将为您提供一个预配置的DataSource

Pro,您正在混合Spring 1.5.2和1.5.3的其他版本,不要混合框架的版本,因为这是等待发生的麻烦。只需删除所有版本,并假设您正确地使用Spring和Gradle,您将有一个托管版本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43569368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档