2017-04-11 13 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)); 


    } 

エラー:アプリケーションコンテキスト内のBeanのいくつかの依存関係がサイクルを形成します

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であってはなりません。

春のブートでは、@Beanを2通り作成できます。一つは@Beanとしてクラスを定義している:

@Bean 
public class MyBean { 

} 

他の方法は、方法を介して行われる。

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

上記の両方Contextを作成するときに、@Bean Sを作成します。

+0

'@ Configuration'と' @ Bean'の両方をクラスにドロップすることについて「適切な」ものは何もありません。そして、Springブートでは、アプリケーションのブートストラップクラスにBeanを定義するのは悪い方法です。 (非常にコンパクトな例では、入れ子クラスを追加してください。) – chrylis

+0

@chrylis私は同意します。 – xenteros

+0

'@ Configuration'は' @ Component'(メタ注釈)で注釈された特別なBeanです。 'AppConfig'はBeanです。 –

関連する問題