質問:
@Component
1)と@Configuration
の 違い
どちらも XML にコードを配線する必要がないことを読んだことがありますが、これらの違いはわかりませんでした。
2)との違いは何@Autowired
ですか?
- いつ使う?
- それぞれの長所と短所は何ですか?@Inject
@Resource
質問:
@Component
1)と@Configuration
の 違い
どちらも XML にコードを配線する必要がないことを読んだことがありますが、これらの違いはわかりませんでした。
2)との違いは何@Autowired
ですか?
- いつ使う?
- それぞれの長所と短所は何ですか?@Inject
@Resource
@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という名前
のAlphaClass
Beanと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
したがって、アノテーションを使用するときは、常にリソース名を明示的に指定することをお勧めします。
ドキュメンテーション
shevchikが指摘したように、修正されたJSR参照を更新します。DI固有のアノテーションは、Google(Guice Framework)およびSpringSource(Spring Framework)のエンジニアによって開発されたJSR-330によって提供されます。@Resource
JNDIベースであり、JSR-250によって提供されます。
@Component
は と同等<bean>
です。
@Configuration
は と同等<beans>
です。
上記のほとんどの回答で、ユーザーは @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 としてマークする必要があるのは、コードを読みやすくするためだけだと思います。実際の実行に関しては、違いはないようです。
1)XML構成が必要な場合は、@ Configurationを無視します。これは、Javaベースの構成でのみ役立つためです。利用可能な例が他にもあるので、Springに慣れていない人にはXML構成がおそらく最適です。
@Component注釈付きクラスは、コンポーネントのスキャン中に取得されます。それらを使用して、SpringBeanとして公開するクラスにラベルを付けます。ここでも、XML構成ですべてのBeanを宣言し、@Componentを完全に無視することができます。
2)アプリケーションをSpringに結び付けることに満足している場合は、javaxの同等の@Injectではなく@Autowireを使用してください。Springへの依存関係を受け入れることが開始するための最良の方法であることをお勧めします。
との違いについて@Autowired
は、こちらを参照してください。ここでは、詳細な説明と比較を行うことができます。@Inject
@Resource
最初の違いに関するもの:ベースの構成の@Configuration
代わりとして使用されます。ベースの構成にXML
使用されるものとしてクラスをマークします。こちらを参照してください。次に、インスタンス化されるクラスとしてクラスをマークするために実際に使用され、注釈によってメタ注釈が付けられます。Java
@Component
Spring
@Configuration
@Component
@Component
@Configuration
目的が違うので比べても意味がありません。