[Spring] DI



CS 17日目を勉強します.今日,Springの重要な概念の一つであるDIの実際の応用を主線として,TobiのSpring 3.1を読み,それをまとめた.

DIとは何ですか。


注入
  • beanオブジェクト間の関係
  • 注入
  • Bean以外のオブジェクトまたは単純値
  • @RODI必要

    <context : annotation-config/>
    専用ラベル
  • @Resourceは、メタデータ依存関係情報の読み取りと追加機能を有する空のポストプロセッサを登録するために使用される.
    <context : component-scan/>

  • annotation-configが生成した空の登録と、空のスキャン登録方法を指定するための専用タグ.

  • AnnotationConfigApplicationContext,AnnotationConfigWebApplicationContext:空のスキャナとノイズ依存情報を読み取るための内蔵アプリケーションContext.
  • bean依存関係の設定


  • bean登録方法とbean依存関係設定方法は同じである必要はありません.

  • DIを直接指定するbeanのid

  • Autowiring:プログラムやジェネレータパラメータを明示的に指定することなくcontainerにDI設定を自動的に追加するには、事前に決定されたルールを使用します.
  • 精子注入を受ける

    <bean>
    	<property name=“sample” ref=“sample” />
    	<property name=“age” value=“30” />
    </bean>
  • の値を入れることができるタイプは制限されず、タイプに応じて自動的に変換できます.(Ex: “30”-> 30)
  • インプラント作成者

  • XML自動線引き:XMLの数を減らすことができますが、コードだけではどのようなDIが発生するか分かりにくく、スペースを1つしか指定できないのが欠点です.
  • <constructor-arg type=“java.lang.String” value=“Spring” />
    <constructor-arg type=“springbook.learningtest.spring.ioc.bean.Printer” ref=“printer” />
  • byName:プロパティ名をDIのbean名と同じ名前にする方法の慣例.
  • <bean id=“hello” class=“springbook.learningtest.spring.ioc.bean.Hello" autowire=“byName">
    	//<property name=“sample” ref=“sample” />는 자동으로 추가됨
    	<property name=“age” value=30/>
    </bean>
  • HelloレベルのProperty名と同じスペースを見つけ、自動的にPropertyとして登録します.
  • <beans default-autowire=“byName”>
    	<bean>...</bean>
    ...
    </beans>
  • ビットのように一度に完了できます.
  • byType:byName同様にbyTypeを加えるとよい.空の名前は気にしなくても良いのですが、欠点は同じタイプの空が2つ以上ある場合は適用されないことです.そしてbyNameより遅いです.
  • @Resource


  • byName autowire

  • モディファイヤメソッド
  • @Resource(name=“sample”)
    public void setSample(Sample sample){
    	this.sample=sample;
    }
  • フィールド
  • @Resource(name=“sample”)
    private Sample sample;

  • フィールド注入と呼ばれます.

  • setterの作成はユニットテストに便利で、統合テストはsetterを必要とせず、フィールド注入を使用するだけでよい.(データソースDIをDAOに使用する場合)

  • フィールドもsetterもnameを省略できます

  • XMLのAutowiringと@Resourceの違いは、XMLに対応するスペースがない場合は無視され、@Resourceでは例外が発生します.
  • @Autowired


  • byType autowire

  • @Autowiredはスプリングのみ、類似の@Injectは他のJavaフレームワークにも使用可能

  • @Autowiredは、XML byType Autowiredをジェネレータ、フィールド、モディファイヤメソッド、および一般的なメソッドに拡張します.

  • 最も柔軟で最も強力なDI設定方法

  • @を使用して、テストクラスのオブジェクトに依存関係を設定します.

  • フィールド
  • @Autowired
    private ClassService classService;

  • @Resourceとは異なり、名前ではなくフィールドまたはPropertyタイプを使用して空候補を検索します.

  • モディファイヤメソッド
  • @Autowired
    public ClassController(ClassService classService) {
    	this.classService=classService;
    }
  • ジェネレータ
  • @Autowired
    Collection<ClassService> classService;

    @Qualifier


  • 非タイプ情報を追加して自動ループを制御する補助方法

  • 2つのDBを使用している場合、両方の空がDataSourceです.エラーが発生した場合は、次の操作を行います.

  • フィールド、モディファイヤメソッド、パラメータを付与できます.作成者と通常のメソッドには意味がありません.
  • @Autowired
    @Qualifier(“mainDB”)
    DataSource dataSource;
    
    <bean id=“oracleDataSource” class=“aDataSource">
    	<qualifier value=“mainDB”/>
    </bean>
    @Autowired
    @mainDB
    public class OracleDataSource{
    ...
    }

    @Configuration+@Bean


  • メソッド呼び出しによるメソッドとして定義された別の空の参照

  • @Configuration+@Beanロビンが作成されている場合はDI
  • @Autowired/@Resource
    public class Hello{
    	@Autowired Printer printer;
    }
    
    @Configuration
    public class Config{
    	@Bean public Hello hello(){
    		return new Hello();
    	}
    	@Bean public Printer printer(){
    		return new Printer();
    	}
    }
    
    //@Autowired가 후처리기로 진행되기 때문에 config에는 bean만 등록해주어도 된다.
  • @Beanメソッド呼び出し
  • @Configuration
    public class Config {
     @Bean public Hello hello(){
    	Hello hello = new Hello();
    	hello.setPrinter(printer());
    	return hello;
    }
    @Bean public Printer printer(){
    	return new Printer();
    }
    //직관적. 싱글톤으로 printer가 만들어짐. printer메소드를 직접 실행시켜 DI
  • @Beanとメソッド自動配線
  • @Configuration
    public class Config {
     @Bean public Hello hello(Printer printer){
    	Hello hello = new Hello();
    	hello.setPrinter(printer);
    	return hello;
    }
    @Bean public Printer printer(){
    	return new Printer();
    }
    //printer()에 의해 Printer 빈이 선언되었으며 이를 파라미터로 지정하여 DI

    値DIメソッド

  • property
  • <bean id=“hello”>
    	<property name=“name” value=“Everyone” />
    </bean>
  • 専用ラベル
  • <aop:advisor advice-ref=“ref” pointcut=“bean(*Service)” />
  • @Value
  • @Value({database.username})
    private String username;
    
    @Bean
    public Hello hello(){
    	Hello hello = new Hello();
    	hello.setName(this.name);
    	return hello;
    }
    //런타임 시에 외부로부터 주입을 통한 초기화가 존재.

    タイプ変換


  • PropertyEditor:Javaが提供するタイプ変換器を使用して、基本タイプ、オブジェクトタイプ、配列などを変換します.

  • ConversionServices:Springが提供するタイプの変換器は、PropertyEditorよりも書きやすいマルチスレッド環境で共有できます.
  • コレクション

    <property name=“names”>
    	<list>
    		<value>Spring</value>
    		<value>IoC</value>
    		<value>DI</value>
    	</list>
    </property>
    
    <property name=“ages”>
    	<map>
    		<entry key=“Kim” value=“30” />
    		<entry key=“Lee” value=“25” />
    		<entry key=“Park” value=“20” />
    	</map>
    </property>
    
    <property name=“ages”>
    	<props>
    		<prop key=“id”>Spring</prop>
    		<prop key=“pw”>Book</prop>
    	</props>
    </property>

    保証する


  • XMLの設定情報(ex:dataSource)の一部をファイルに分離し、設定値として指定します.

  • ローカルおよび管理など、異なるサーバ環境で適用される情報を分離

  • @Valueまたはvalue attributeにプロファイルを参照させると有効です.
  • 手動変換
  • <context:property-placeholder location=“class path:database.properties” />
    <property name =“username” value=${db.username} />
    @Value(“${db.username}) 
    String username;
  • 空工場後プロセッサ空のメタデータ情報のProperty値情報からdb.ユーザー名を見つけて変更します.
  • アクティブ変換(SpEL:Spring Extension Language)
  • <bean id=“user”>
    	<property name = “name” value=“Spring">
    </bean>
    <bean id=“names">
    	<property name =“username” value=“#{user.name}" />
    </bean>
    @Component(“user”)
    public class User{
    	private String name=Spring;
    	public String getName(){
    		return name;
    	}
    	public void setName(String name){
    		this.name=name;
    	}
    }
    
    @Value(“#{user.name})
    private String username;
  • は、エラー検証を行い、
  • は、空のオブジェクトに直接アクセスすることによってプロジェクトをインポートし、空のプロセッサがプロジェクトファイルで値を検索して変更するのを待つ必要はありません.

    コンテナ自動登録の空

  • ApplicationContext
  • BeanFactory
  • ResourceLoader
  • ApplicationEventPublisher
  • systmeProperties
  • systemEnvironment