义齿

4904 ワード

Spring構成のオプションスキーム
Springコンテナは、アプリケーション内のbeanを作成し、DIによってこれらのオブジェクト間の関係を調整します.開発者としてspringがどのbeanを組み立てる必要があるか、どのように組み立てるかを伝える必要があります.Springは3つの主要な組立メカニズムを提供しています
  • xmlに表示するアセンブリ
  • Javaでの構成
  • ステルスbean発見メカニズムと自動構成
  • 3つの構成スキームを提供してもspringが複雑になることはありません.各構成テクノロジーが提供する機能はいくつか重なっているので、特定のシーンでは、どのテクノロジーが最も適切かを特定するのは難しくなりますが、緊張する必要はありません.多くのシーンでは、その案を選ぶのは個人の好みの問題であり、できるだけ自分の好きな方法を選ぶことができます.唯一の答えはありません.あなたが選んだ選択はあなたとあなたのプロジェクトに合わなければなりません.また、私たちは1つの構成案しか選択できないわけではありません.springの構成スタイルは互いに組み合わせることができるので、xmlを使ってbeanを組み立てることができます.springのJavaベースの構成(JavaConfig)を使って他のbeanを組み立てることができます.残りのbeanはspringに自動的に発見させます.
    それでも、自動構成メカニズムをできるだけ使用することをお勧めします.明示的な構成が少ないほど良いです.beanを明示的に構成する必要がある場合(たとえば、ソースコードの中には、自分で管理するものではなく、beanを構成する必要がある場合)では、タイプが安全でxmlよりも強力なJavaConfigを使用することをお勧めします.最後に、便利なxmlネーミングスペースを使用し、JavaConfigで同じ実装がない場合にのみ、xmlを使用する必要があります.
    自動アセンブリbean
    スプリングが自動化されたアセンブリが可能であれば、これらのbeanを一緒にアセンブリするのに苦労することはありませんか?
    スプリング自動アセンブリを2つの角度から実現
  • コンポーネントスキャン(component scanning):springは、アプリケーションコンテキストで作成されたbean
  • を自動的に検出します.
  • 自動アセンブリ(autowiring):springはbean間の依存を自動的に満たす
  • コンポーネントスキャンと自動アセンブリを組み合わせると、明示的な構成を最小限に抑えることができる大きな威力を発揮します.
    CDプレーヤーの例で自動化組立について説明する
    maven pom.xml依存
      
        
          junit
          junit
          3.8.1
          test
        
    
        
            org.springframework
            spring-context
            4.3.11.RELEASE
        
        
        
        
            org.springframework
            spring-test
            4.3.11.RELEASE
            provided
        
    
      
    

    CompactDiscインタフェース【CD】
    package soundsystem;
    
    public interface CompactDisc {
        void play();
    }
    
    

    CompactDisc実装クラスSgtPeppers
    package soundsystem;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class SgtPeppers implements CompactDisc {
        private String title="    ";
        private String artist="   ";          //artist             
    
        public void play() {
            System.out.println("Playing "+title+" by "+artist);
        }
    }
    
    

    **java構成クラスCDPlayerConfig**
    package soundsystem;
    
    import org.springframework.context.annotation.ComponentScan;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @ComponentScan
    public class CDPlayerConfig {
        
    }
    
    

    **テストクラスCDPlayerTest**
    package soundsystem;
    
    import static org.junit.Assert.*;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes=CDPlayerConfig.class)
    public class CDPlayerTest {
        
        @Autowired
        private CompactDisc cd;
        
        @Test
        public void cdShouldNotBeNull(){
            assertNotNull(cd);
        }
    }
    
    

    重点を置く
    @Componentという簡単な注記は、クラスがコンポーネントクラスとして機能することを示し、springにこのクラスのbeanを作成するように伝えます.プログラムではSgtPeppers beanを明示的に構成する必要はありません.このクラスは@Component注釈を使用しているので、springは適切に処理しますが、コンポーネントスキャンのデフォルトは有効ではありません.またspringの構成を表示し、@Component注釈付きクラスを検索し、beanを作成するようにコマンドする必要があります.
    クラスCDPlayerConfigはjavaコードによってspringのアセンブリルールを定義し、クラスにはbeanが明示的に宣言されていませんが、springでコンポーネントスキャンを有効にする@ComponentScanコメントが使用されています.他の構成がなければ、@ComponentScanは構成クラスと同じパッケージをスキャンすることを認識しています.xmlでコンポーネントスキャンを有効にする傾向がある場合は、Spring contextネーミングスペースの要素を使用できます.xmlのbeansラベルにを追加
    CDPlayerTestはSpringのSpringJUnit 4 ClassRunnerを使用し、テスト開始時にSpringのアプリケーションコンテキストを自動的に作成します.注記@ContextConfigurationは、CDPlayerConfigに構成をロードする必要があることを示します.
    コンポーネントスキャンのbeanに名前を付ける
    SpringアプリケーションコンテキストのすべてのbeanにはIDが与えられます.前の例では、SgtPeppers beanにIDを明確に設定していませんが、Springはクラス名に基づいてIDを指定します.具体的には,このbeanが与えたIDはsgtPeppers,すなわちクラス名の最初のアルファベットを小文字にする.このbeanに異なるIDを設定するには、@Component注記に所望のIDを値として渡す必要があります.たとえば、このbeanをloneyHeartsClubとして識別するには、SgtPeppersクラスの@Component注記を次のように構成する必要があります.
    @Component("loneyHeartsClub")
    public class SgtPeppers implements CompactDisc{
        ...
    }
    

    @Component注記ではなくjava依存注入仕様(Java Dependency Injection)で提供されている@Name注記を使用してbeanにIDを設定するbeanの名前を付ける方法もあります.
    package soundsystem;
    
    import javax.injection.Named;
    
    @Named("loneyHeartsClub")
    public class SgtPeppers implements CompactDisc{
        ...
    }
    

    Springは@Nameを@Component注記の代替案としてサポートします.両者の間にはわずかな違いがありますが、ほとんどのシーンでは、互いに代わることができます.
    名前に関しては@Nameについて@Componentのように明確に何をしているかは示されていないと思います