質問:
1)@Component
と@Configuration
の違いは?
どちらもXMLにコードを配置する必要性をなくしましたが、これらの間に違いはありませんでした。
2)@Autowired
、@Inject
、および@Resource
の違いは何ですか?
-どの場合に使用しますか?
-それぞれの長所と短所は何ですか?
@Component
と@Configuration
は、実際には非常に異なるタイプの注釈です。
@Component
および同様の注釈(@Service
、@Repository
など)およびその JSR-3 対応する@Named
を使用すると、<context:component-scan/>
または@ComponentScan
で自動スキャンすることでピックアップされるBeanを宣言して、そのため、指定されたBeanをXMLの<bean ... />
タグで宣言することとほぼ同等です。このBeanタイプは、標準のプロキシ作成ポリシーに準拠します。
@Configuration
注釈は、XML構成ファイルの置き換えとして設計されました。 @Configuration
注釈付きBeanを作成するために、Springは常にCGLIB
を使用して@Configuration
注釈付きクラスをサブクラス化し、その@Bean
注釈付きメソッドをオーバーライドしてBeanルックアップメソッドで置き換え、シングルトンBeanを1回だけ作成します。 (SpringはCGLIB
を使用してインターセプトしませんinternalnormal Spring Beanのメソッド呼び出し、代わりにプロキシの別のインスタンスを作成します(JDKプロキシと同じ方法)これにより、プロキシを使用してカーディナリティの不一致を回避できます-たとえば、プロキシシングルトンは現在のセッションBeanを取得できますが、これはクラス継承のみでは不可能です。それにもかかわらず、@Configuration
注釈付きクラスは、annotated(@Autowired
、@Inject
など)フィールドとプロパティを使用して、コンテナからBean(および他の@Configuration
注釈付きBeanも)を要求できます。
例documentation の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
は@Autowired
または@Autowired(required=true)
と同等ですが、JSR-330の@Inject
annotationでは@Autowired(required=false)
動作を取得できません。この注釈は、常にタイプごとの自動配線を使用します。
Springは JSR-25@Resource
アノテーションをかなり特別な方法で実装します。 @Resource
は元々Java EEでJNDIリソースを見つけるために設計されましたが、Springは適用範囲を広げてコンテナ内の任意のBeanにワイヤリングできるようにします(JNDIリソースは、 SimpleJndiBeanFactory )。対応するBeanの名前は、@Resource
アノテーションのname
属性として指定でき、名前が指定されていない場合は、注釈付きフィールドまたはプロパティの名前が使用されます。プロパティ名のBeanが見つからなかった場合、スプリングはタイプ別の配線にフォールバックします。
例AlphaClass
Beanという名前のbeanAlphaとBetaClass
Bean beanBetaがあると想像してくださいコンテナ。
@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
アノテーションを使用する場合は、常にリソース名を明示的に指定することをお勧めします。
ドキュメント
updateshevchikが指摘したように、JSR参照を修正しました。 DI固有の注釈は、Google(Guice Framework)およびSpringSource(Spring Framework)エンジニアによって開発されたJSR-330によって提供されます。 @Resource
はJNDIベースであり、 JSR-25 によって提供されます。
@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としてマークするのは、コードを読みやすくするためだけだと思います。実際の実行に関しては、違いはないようです。
@Autowired
、@Inject
、および@Resource
の違いについては、 here を参照してください。ここで、詳細な説明と比較を行うことができます。
最初の違いに関係するもの:@Configuration
はXML
ベースの構成の代替として使用されます。クラスはJava
ベースの構成に使用されるものとしてマークされます。 here を参照してください。次に、@Component
は、クラスをSpring
によってインスタンス化されるものとしてマークするために実際に使用され、@Configuration
は@Component
注釈によってメタ注釈が付けられます。
@Component
と@Configuration
は異なる目的で使用されるため、それらを比較しても意味がありません。
1)XML構成が必要な場合は、@ Configurationを無視します。これはJavaベースの構成にのみ役立つためです。 XML構成は、使用可能なサンプルが他にもあるため、Springに不慣れな人にはおそらく最適です。
@Component注釈付きクラスは、コンポーネントのスキャン中に取得されます。それらを使用して、Spring Beanとして公開するクラスにラベルを付けます。繰り返しますが、XML構成ですべてのBeanを宣言し、@ Componentを完全に無視することができます。
2)アプリケーションをSpringに結び付けたい場合は、javaxに相当する@Injectではなく@Autowireを使用します。私は、Springへの依存を受け入れることが最良の開始方法であることを提案します。