2016-10-11 19 views
2

私は、次のようにスプリングブートアプリケーションの異なるパッケージにある3つのクラスを持っています: @Autowiredはなぜ特定のクラスでのみ動作しますか? SpringブートAutowiredに失敗しました - ヌル

@Configuration 
public class Configurations{ 
    @Autowired 
    Prop prop; //works fine 

    @Bean 
    //other bean definitions 

} 

@Component 
public class Prop{ 
    public void method(){}; 
} 

public class User{ 
    @Autowired 
    Prop prop; //does not work, null 

    public void doWork(){ 
     prop.method(); 
    } 

} 

は私も @PostConstructを試してみましたが、春には、クラス自体がのSpring Beanであることを検出した場合と同じ結果

public class User{ 
     @Autowired 
     Prop prop; //does not work, null 

     @PostConstruct 
     public void doWork(){ 
      prop.method(); 
     } 

    } 
+0

その後、Beanアノテーションを使用してBeanアノテーションを使用し、他のメソッドでも使用できるようにコンフィグレーションでメソッドを作成することができます。bean public Prop prop(){...} –

答えて

5

@Autowired注釈にのみ機能します。

最初の例ではConfigurations@Configurationアノテーションを付けたアノテーションを付けました。一方、Userクラスには、Spring Beanであることを示すアノテーションはありません。

あなたのクラスはSpringコンテナによってピックアップされているようにする(別の意味での)さまざまな注釈がありますが、いくつかの例は@Service@Component@Controller@Configuration、あります...。ただし、これはクラスがSpringコンテナによってスキャンされているパッケージ内にある場合にのみ有効です。 Springブートでは、これを保証する最も簡単な方法は、Userクラスをメインクラスのサブパッケージ(@SpringBootApplicationで注釈を付けたクラス)に入れることです。

あなたはまた、手動Configurationsに次のメソッドを書くことによって、あなたのBeanを作成することができます。

@Bean 
public User user() { 
    return new User(); 
} 

この場合は、あなたのUserクラスに注釈を付ける必要はありません、でもあなたは必ずそれことを確認する必要がありますスキャン中のパッケージに含まれています。

関連する問題