2017-04-23 8 views
0

Der folgende Code erzeugt einen zyklischen Abhängigkeitsfehler.Warum führt das Autodiring jdbctemplate zu einer zyklischen Abhängigkeit?

@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 
└─────┘ 

aber wenn ich es nicht jdbctemplate autowire und initialisieren normalerweise

jdbcTemplate = new JdbcTemplate(dataSource()); 

dann werden keine Fehler

erzeugt

Ich habe folgende gradle Abhängigkeiten:

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' 

} 

Was ist der Grund für die zyklische Abhängigkeit?

+0

Da es eine '@ Bean'-Methode für die Datenquelle gibt, wird die Datenquelle für die' JdbcTemplate' benötigt, aber die einschließende Klasse wird benötigt, um eine 'DataSource' zu ​​erstellen. –

Antwort

0

Sie haben eine zyklische Abhängigkeit, weil die JdbcTemplate eine DataSource braucht aber für die DataSource eine Instanz des Controllers benötigt wird geschaffen werden, sondern weil das eine JdbcTemplate braucht es nicht (aufgrund der zyklischen Abhängigkeit) aufgebaut werden kann.

Sie verwenden Spring Boot, aber scheinbar versucht, nicht zu. Entfernen Sie Ihre @Bean Methode für die DataSource und fügen Sie dem application.properties folgend hinzu.

spring.datasource.url=jdbc:mysql://localhost:3306/people 
spring.datasource.username=root 
spring.datasource.password=root 

Mit diesem Frühjahr Boot wird eine vorkonfigurierte DataSource für Sie.

Pro-Tip Etwas anderes Sie mischen Versionen von Spring-Boot 1.5.2 und 1.5.3 nie Versionen eines Rahmens mischen, dass Probleme auf uns zukommen. Entfernen Sie einfach alle Versionen, und vorausgesetzt, Sie verwenden Spring Boot mit Gradle ordnungsgemäß, haben Sie eine einzige verwaltete Version.

Verwandte Themen