2017-09-12 20 views
0

を使用せずに新しいBeanを作成し、私は、私は上記のコードは、ProductDataModelためのBeanを作成しているようだ@Service @Scopeが@Bean注釈

@Slf4j 
@Service 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class ProductDataModel { 
@Value("${message}") 
private String message; 

で注釈されているクラスを持っています@Beanアノテーションを使用せずに

私は@Autowired ProductDataModel productDataModelを私のコードに使用しています。上記のコードと一緒に使用すると、依存関係のproductDataModelはnullではありません。

どのように上記のコードがBeanを作成していますか?

理想的には、私は以下のコード

//I am not using this piece of code in my program., for reference only 

@Configuration 
public class OSCConfig { 

@Bean 
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS) 
ProductDataModel productDataModel(){ 
return new ProductDataModel(); 
} 

を使用する場合にのみ作成にBeanを期待しているだろう誰かがコードしている時にいずれかを使用するの2枚の違いを説明することができます。

+0

これはコンポーネントスキャンです。使用するクラス/ Beanごとに '@ Bean'を指定する必要はありません。 '@ Component'や' @Service'のような特別なバージョンのものをクラスに置くと、それはコンポーネントスキャンを使うときに自動的に検出されます。 –

+0

これが当てはまる場合は、コンストラクタで宣言するBeanを使用している場合や、init、cleanupなどのライフサイクルコールバックメソッドを指定する場合にのみ@Beanを使用する必要があります。 – Abhi

+0

実際には、 '... –

答えて

0

@Serviceアノテーションは、(パッケージスキャンの一部として)作成するオブジェクトをスキャンするときに、Springによってピックアップされます。これはspring @ Componentアノテーションの特殊化ですが、意図した目的についてユーザーに指示する以外にはほとんどありません。 @Controlllerアノテーションは似ていますが、作成されたBeanは特定の特性を持っています。

@Beanアノテーションは、オブジェクトの作成時にも使用されます。このコンテキストでは、Configurationクラスのメソッドにあります。したがって、作成されるBeanはメソッドによって返される型です。

+0

ご回答いただきありがとうございますが、これは私の質問@Service + @ Scopeです。@ Beanを使用せずに新しいBeanインスタンスを作成します。 – Abhi

0

@M。 Deinumは、@Serviceまたは@Controller注釈を宣言するときに各クラスに@Beanを指定する必要はないと指摘しました。コンポーネント検索がそのパッケージに対して有効になっている場合、Springコンテナによって選択されます。

ので@Beanを使用するための良いユースケースは、クラスは、サードパーティ製の瓶であり、あなたはいくつかのカスタムを追加したい場合は、コントローラの注釈

  • @/@サービスを追加することができない場合

    • ているかもしれません@Bean注釈メソッド内のロジック