2017-08-22 17 views
-3

私のアプリケーションには、とりわけ以下のクラスが含まれていますフィールド用の前記インターフェースを使用する。春ComponentScanパッケージ構造

@Component 
class com.foo.appl.pack.ImplementationClass { 

@Autowired 
ClassToAutowire autoClass; 

@Scheduled(fixedRate = 60000) 
public void startStuff() { 
    // do something... 
    } 

} 

しかし、フィールドがautowireません。

フィールドAUTOCLASSをcom.foo.appl.pack.ImplementationClassでは見つかりませんでした型「com.foo.bar.ClassToAutowire」の Beanを要求しました。

処置:

は、あなたの 構成のタイプ 'com.foo.bar.ClassToAutowire' のBeanを定義することを検討してください。

私の春は私のパッケージ構造が嫌いでしょうか?

com.foo.bar.ClassToAutowire 
com.foo.appl.SpringMainApplication 
com.foo.appl.pack.ImplementationClass 

@SpringBootApplicationは、ルートパッケージにする必要もありませんし、すべてのコンポーネントがサブパッケージでなければなりませんか?その場合、ClassToAutowireはインポートされたJARに由来しているので、どのようにして私の "問題"を解決しますか?

basePackgecom.foo.barに変更すると、アプリケーションが起動しますが、スケジュールされた方法は実行されません。

おかげ

+0

'SpringMainApplication'を' com.foo'に入れるか、 '@ComponentScan(" com.foo ")'をあなたの 'SpringMainApplication'に追加してください。 –

+0

'com.foo'に' SpringMainApplication'を置くと私の問題は解決しますが、私は自分のパッケージ構造をそのままにしておきたいと思います... '@ComponentScan(" com.foo ")'は既にSpringMainApplicationに追加されています。 – eiz

+1

トップレベルパッケージの出発点としては、ベストプラクティスです。あなたが本当にそれを望まないのであれば(特にもっと多くのフレームワークを使い始めるときにはいくつかの欠点があります)、@ComponentScan( "com.foo")を追加してください。しかし、これはSpring Dataリポジトリの自動検出ではなく、 JPAエンティティなどの場合、他にも無料で入手できるたくさんの追加設定が必要になります。 –

答えて

0

スプリングブートを使用すると、デフォルトでコンポーネントスキャンが実行されます。このコンポーネントスキャンは、@SpringBootApplication注釈付きクラスと同じパッケージから開始されます。あなたの場合はcom.foo.applですが、これはcom.foo.barをカバーしません。

@SpringBootApplication注釈付きクラスを、最も高いレベルのパッケージ(あなたの場合はcom.foo)に配置することをお勧めします。これにより、その下のすべてのパッケージがスキャンされ、適切なコンポーネントが含まれます。あなたはまた、それは別のパッケージまたは(@SpringBootApplication(basePackage="com.foo")でスキャンを開始させるために、あなたの@SpringBootApplication注釈付きクラスに@ComponentScan("com.foo")を追加することができ

もはや依存ジャーのコンポーネントがない場合、あなたはまたに@Beanメソッドを追加することができます第二の方法の欠点は、春データやJPAのようなものを使用しているときにも、手動でそれらを設定する必要がありますということです

@Bean 
public ClassToAutowire classToAutowire() { 
    return new ClassToAutowire(); 
} 

。目的のクラスのインスタンスを作成します(@EnableJpaRepositoriesとのようなものを追加します)。これは、異なるフレームワークを使用/追加するときに増加します。これは、すべてのパッケージが考慮されるため、クラスを最上位パッケージに入れるときには当てはまりません。

0

い@SpringBootApplicationルートパッケージにする必要があり、すべてのコンポーネントがサブパッケージでなければなりませんか?いいえ、@SpringBootApplicationはどこにでも配置することができますが、ClassToAutowireクラスの実装は、外部のパッケージから来る場合、あなたはその瓶から春の設定をインポートする必要があります@ComponentScan

に正しいパスを提供する必要があります。これは、@Configurationで注釈が付けられた構成クラスを定義し、次に@Importアノテーションを使用してこの構成をImplementationClassにインポートすることを意味します。 ここで説明する春の自動設定を使用して別のwoulb:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html

+0

これは質問に対する答えを提供しません。十分な[評判](https://stackoverflow.com/help/whats-reputation)があれば、[投稿にコメントする]ことができます(https://stackoverflow.com/help/privileges/comment)。代わりに、[質問者からの明確化を必要としない回答を提供する](https://meta.stackexchange.com/questions/214173/why-do-i-need-50-reputation-to-comment-what-c​​an- i-do-代わりに)。 - [レビューの投稿](/レビュー/低品質の投稿/ 17105304) –

0

あなたはインタフェースcom.foo.bar.ClassToAutowireを実装し、でクラスに注釈を付ける必要があります@Component

@Component注釈を付けていることを示しクラスは「コンポーネント」です。このようなクラスは、アノテーションベースの構成とクラスパスのスキャンを使用する際の自動検出の候補とみなされます。 reference @Component documentation

関連する問題