44

質問:

@Component1)と@Configurationの 違い

どちらも XML にコードを配線する必要がないことを読んだことがありますが、これらの違いはわかりませんでした。

2)との違いは何@Autowiredですか? - いつ使う? - それぞれの長所と短所は何ですか?@Inject@Resource

4

5 に答える 5

56

@Component実際、@Configuration非常に異なる種類の注釈です。

@Componentおよび同様のアノテーション(@Service、、@Repositoryなど)およびそれに対応するJSR-330@Namedを使用すると、自動スキャンによって取得されるBeanを宣言する <context:component-scan/>@ComponentScan、クラスのBean定義を登録できるため、指定されたBeanを宣言するのとほぼ同じです。 XMLの<bean ... />タグ。このBeanタイプは、標準のプロキシ作成ポリシーに準拠します。

@Configuration注釈は、XML構成ファイルの代わりとして設計されました。注釈付きBeanを作成するため@Configurationに、Springは常に注釈付きクラスCGLIBをサブクラス化するために使用し、注釈付きメソッドを@Configurationオーバーライド@BeanしてBeanルックアップメソッドに置き換え、シングルトンBeanを1回だけ作成します。(Springは通常のSpring Beanの内部メソッド呼び出しCGLIBをインターセプトするために使用せず、代わりにプロキシの個別のインスタンスを作成します(JDKプロキシと同じ方法)。そうすることで、プロキシを使用してカーディナリティの不一致を回避できます。たとえば、プロキシシングルトンはフェッチできます。現在のセッションBean。これはクラス継承のみでは不可能です。)それにもかかわらず、注釈付きクラスは引き続きannotated(、@Configuration@Autowired@Inject@Configurationなど)コンテナからBean(および他の注釈付きBeanも)を要求するためのフィールドとプロパティ。

ドキュメントの4.12.5セクションの

@Configuration
public class AppConfig {

  @Bean
  public ClientService clientService1() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }
  @Bean
  public ClientService clientService2() {
    ClientServiceImpl clientService = new ClientServiceImpl();
    clientService.setClientDao(clientDao());
    return clientService;
  }

  @Bean
  public ClientDao clientDao() {
    return new ClientDaoImpl();
  }
}

上記の例では、1つのClientDaoインスタンスのみが作成されます。

@AutowiredはSpringアノテーションであり、@InjectはJSR-330アノテーションです。 または@Injectと同等ですが、JSR-330アノテーションでは動作を取得できません。この注釈は常にタイプ別の自動配線を使用します。@Autowired@Autowired(required=true)@Autowired(required=false)@Inject

Springは、かなり特殊な方法でJSR-250 @Resourceアノテーションを実装しています。@ResourceもともとはJavaEEでJNDIリソースを見つけるために設計されましたが、Springはその適用範囲を広げ、コンテナ内の任意のBeanにワイヤリングできるようにします(JNDIリソースはSimpleJndiBeanFactoryを使用してBeanとして利用できます)。対応するBeanの名前をアノテーションのname属性として指定できます。名前が指定されていない場合は、アノテーションが付けられたフィールドまたはプロパティの名前が使用されます。@Resourceもう1つの奇妙な機能は、プロパティ名のBeanが見つからなかった場合、スプリングがタイプ別の配線にフォールバックすることです。

例コンテナにbeanAlphaという名前 のAlphaClassBeanとBeanBeanBetaがあるとしBetaClassます。

@Resource 
BetaClass something;  // Wires to beanBeta - by-type

@Resource 
BetaClass beanAlpha;  // Will throw exception, because "beanAlpha" is not BetaClass -> it's a bad idea to use @Resource as a replacement of @Autowired

@Resource 
Object beanAlpha;  //Wires to beanAlpha - by-name

@Resourceしたがって、アノテーションを使用するときは、常にリソース名を明示的に指定することをお勧めします。

ドキュメンテーション

春の注釈

Beanの標準アノテーション

shevchikが指摘したように、修正されたJSR参照を更新します。DI固有のアノテーションは、Google(Guice Framework)およびSpringSource(Spring Framework)のエンジニアによって開発されたJSR-330によって提供されます。@ResourceJNDIベースであり、JSR-250によって提供されます。

于 2012-09-01T20:06:35.343 に答える
22

@Componentは と同等<bean>です。
@Configurationは と同等<beans>です。

于 2012-09-02T03:59:22.040 に答える
5

上記のほとんどの回答で、ユーザーは @Component と @ Configuration が異なる目的を果たしていると言うよう提案しています。しかし、私はそれが実際に起こっているのを見ません。

しかし、単純な Spring MVC アプリケーションがあります。

@Configuration
    public class SpringConfiguration {

@Bean
public  InternalResourceViewResolver initViewResolver(){
    InternalResourceViewResolver x = new InternalResourceViewResolver();
    x.setPrefix("/WEB-INF/jsp/");
    x.setSuffix(".jsp");
    return x;
}

}

このメイン クラスは、@Configuration ではなく @Component としてアノテーションが付けられていても正常に機能します。

同様に、@Bean でアノテーションが付けられたメソッドがある場合、@Component としてアノテーションが付けられたクラス内では、コンテキストがロードされるときにそれらの Bean が作成されます。

したがって、メイン構成クラスを @Configuration としてマークし、他のクラスを @Component としてマークする必要があるのは、コードを読みやすくするためだけだと思います。実際の実行に関しては、違いはないようです。

于 2012-11-04T10:11:40.653 に答える
2

1)XML構成が必要な場合は、@ Configurationを無視します。これは、Javaベースの構成でのみ役立つためです。利用可能な例が他にもあるので、Springに慣れていない人にはXML構成がおそらく最適です。

@Component注釈付きクラスは、コンポーネントのスキャン中に取得されます。それらを使用して、SpringBeanとして公開するクラスにラベルを付けます。ここでも、XML構成ですべてのBeanを宣言し、@Componentを完全に無視することができます。

2)アプリケーションをSpringに結び付けることに満足している場合は、javaxの同等の@Injectではなく@Autowireを使用してください。Springへの依存関係を受け入れることが開始するための最良の方法であることをお勧めします。

于 2012-09-02T08:31:18.477 に答える
2

との違いについて@Autowiredは、こちらを参照してください。ここでは、詳細な説明と比較を行うことができます。@Inject@Resource

最初の違いに関するもの:ベースの構成の@Configuration代わりとして使用されます。ベースの構成にXML使用されるものとしてクラスをマークします。こちらを参照してください。次に、インスタンス化されるクラスとしてクラスをマークするために実際に使用され、注釈によってメタ注釈が付けられます。Java@ComponentSpring@Configuration@Component

@Component@Configuration目的が違うので比べても意味がありません。

于 2012-09-01T16:14:27.643 に答える