2017-04-11 58 views
1

我已經定義了一個類,它用@Configuration和定義的方法init對其進行了註釋,並使用註釋@Bean對其進行了定義,但是當我嘗試使用自動連接訪問該bean時,它給了我一個錯誤 一些在應用程序上下文豆的依賴形成一個循環:無法在彈簧啓動時定義bean

┌─────┐ 
| Sum defined in class path resource [com/example/Application/Appconfig.class] 

@Configuration 
@EnableAutoConfiguration 
public class Appconfig { 

    @Bean 
    public int Sum(int a,int b){ 

     int c=a+b; 
     return c; 
    } 

我的控制器類

@Autowired 
    Appconfig appconfig; 


    @PostMapping(value = "/api/{id1}/{id2}") 
    public void math(@PathVariable int id1,@PathVariable int id2){ 

     appconfig.Sum(id1,id2); 
     System.out.println(id1); 
     System.out.println(id2); 
     System.out.println(appconfig.Sum(id1,id2)); 


    } 

錯誤

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

┌─────┐ 
| Sum defined in class path resource [com/example/Application/Appconfig.class] 
└─────┘ 

回答

3

你的依賴是圓形的,這意味着,創建A你需要B這就需要A

@Configuration 
@EnableAutoConfiguration 
public class Appconfig { 

    public int Sum(int a,int b){ 

     int c=a+b; 
     return c; 
    } 
} 

將工作,但不是一個好的做法。配置類不應該是@Autowired

在Spring Boot中,您可以通過兩種方式創建@Bean。一個被定義類作爲@Bean

@Bean 
public class MyBean { 

} 

另一種方法是通過該方法:

@Bean 
public RestTemplate restTemplate() { 
    return new RestTemplate(); 
} 

上述的兩個,在創建Context時將創建@Bean秒。

+0

關於在類中放棄'@ Configuration'和'@ Bean'沒有什麼「正確的」,在Boot Boot中定義bean在應用程序引導類中被認爲是不好的做法。 (在非常緊湊的例子中,添加一個嵌套類。) – chrylis

+0

@chrylis我同意。我將它添加到答案 – xenteros

+0

「@ Configuration」是一個特殊的bean,它被註釋爲@ @ Component(元註釋)。 'AppConfig'是一個bean,可以注入 –