選択肢が増えることは良いことでしょうか?
10 年以上にわたる急速な開発とアップデートを経て、Spring はそのユニークな革新性とより多くの選択肢を多くのファンにもたらしました。例えば、Spring Bean のアセンブリ (XML での明示的な設定、Java での明示的な設定、暗黙的な Bean 検出メカニズムと自動アセンブリ)、アノテーションの多様化 (基本的なアノテーション、jsr250、jsr330) などです。
そして、これほど多くの選択を繰り返すことが本当に良いことなのだろうか?これは、学習と習得にかかるコストが増加し、習得がより困難になっているということでしょうか?
例え: あなたも国を救うことができます。スプリングというサイコパスは、医学を勉強していると国を救うことができると言います (XML の明示的な構成)。国 (Java の表示構成) を入力すると、キャプチャと射撃の練習に成功しようとしているときに、国を教育して救うためのより簡単な方法 (Bean の自動組み立て) があることを教えてくれます。
初心者として、私は個人的に、サーブレット、JSP、Struts を学んでから今春にかけて、穴はどんどん大きくなっていると思います。
早速、いくつかの簡単なアノテーションを紹介しましょう:
@Autowired アノテーション: 自動アセンブリを実現します。
1. 次の 2 つのクラスを Spring XML 構成ファイルに挿入する必要があります:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
2. testUtil クラスで testA クラスをアセンブルする場合は、testUtil クラスで @Autowired アノテーションを使用できます。 TestA を TestUtil に挿入する場合、コードは次のとおりです。
public class TestUtil{ @Autowired private Test testA; ....... }
@Autowired アノテーションはコンストラクターだけでなく、メソッドやプロパティでも使用できます。一致する Bean がない場合、Spring はアプリケーション コンテキストの作成時に例外をスローします。例外を回避するには、@Autowired の required 属性を false に設定します。ただし、required 属性を false に設定する場合は注意が必要です。コードに null チェックがない場合、この未アセンブルのプロパティにより NullPointerException が発生する可能性があります。
@Autowired は Spring 固有のアノテーションです。自動アセンブリ タスクを完了するためにコード内のあらゆる場所で Spring 固有のアノテーションを使用したくない場合は、それを @Inject に置き換えることを検討できます。
自動アセンブリでは、Spring は @Inject (JSR330 アノテーション) と @Autowired の両方をサポートします。 @Inject と @Autowired の間には微妙な違いがいくつかありますが、ほとんどのシナリオで互換性があります。
注: 1. 自動アセンブリのみが提供され、注入は前提条件ではありません。
2.自動アセンブリを達成するには、
サポートをインポートする必要があります。または、
@Autowired アノテーションが付けられた依存関係がコンテナー内でそれに対応するインスタンスを 1 つだけ見つけることができる場合は、すべて問題ありませんが、同じタイプのオブジェクト インスタンスが複数ある場合は、@Qualifier アノテーションがその依存関係に対して機能します。
Test クラスに TestA と TestB の 2 つの実装がある場合、Spring 構成ファイルの構成コードは次のとおりです:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testB" class="..../TestB" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
public class TestUtil{ @Autowired @Qualifier("testA") private Test testA; private Test testB; ....... }
@Resource( name="") アノテーション: Bean の実装。その機能は @Autowired アノテーションに似ています。
1. このアノテーションは JSR250 によって導入されたため、使用する前に jsr250 関連の jar パッケージのサポートをインポートする必要があります:
<!-- jsr250注解包的引入 --> <dependency> <groupId>javax.annotation</groupId> <artifactId>jsr250-api</artifactId> <version>1.0</version> </dependency>
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans> 3.在 testUtil 中加入
@Resource (name="") 注:
TestA をTestUtil のコードは次のとおりです:
public class TestUtil{ @Resource(name=“testA”) private Test testA; private Test testB; ....... }
注: @Resource (name="") の名前は注入されるオブジェクトを指定し、testA は Spring 構成ファイルで定義された Bean の ID です。
4. アノテーションを説明する次の 2 つのパッケージの少なくとも 1 つを Spring 構成ファイルに導入する必要があります。個人的には context 要素が好きです。
<context:annotation-config /> <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
备注:JSR250注解有 @PostConstruct,@PreDestroy 。
JSR330注解有 @Inject (代替 @AutoWired)、@Named (代替 @Component)
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ComponentScan(basePackages=“×××××”)注解:启用组件扫描基础包。
1.在 spring 配置文件中加入
配置完成后,
备注:加入该元素后,就不需要再向 spring 配置文件中注入相关的类,即不需要再使用如下配置:
<beans> <bean id="testA" class="..../TestA" /> <bean id="testUtil" class="..../TestUtil" /> </beans>
2.
@Component public class TestUtil{ @Autowired private Test testA; ....... } @Component public class TestA{ private int a; private String ss; ... }
备注:(1)需要在两个类中都标注 @Component 注解。
(2)该注解是类级别的,它添加在类之上。
(3)@Component("id号")注解:表明该类会作为组件类,并告知Spring要为这个类创建bean。若id号为空,则默认使用以小写开头的类名!若使用自定义id号,则在后续的引用中需要引入以该id为标记。