[Spring] DI
CS 17日目を勉強します.今日,Springの重要な概念の一つであるDIの実際の応用を主線として,TobiのSpring 3.1を読み,それをまとめた.
DIとは何ですか。
注入
@RODI必要
<context : annotation-config/>
専用ラベル<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>
インプラント作成者
<constructor-arg type=“java.lang.String” value=“Spring” />
<constructor-arg type=“springbook.learningtest.spring.ioc.bean.Printer” ref=“printer” />
<bean id=“hello” class=“springbook.learningtest.spring.ioc.bean.Hello" autowire=“byName">
//<property name=“sample” ref=“sample” />는 자동으로 추가됨
<property name=“age” value=“30” />
</bean>
<beans default-autowire=“byName”>
<bean>...</bean>
...
</beans>
@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만 등록해주어도 된다.
@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
@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メソッド
<bean id=“hello”>
<property name=“name” value=“Everyone” />
</bean>
<aop:advisor advice-ref=“ref” pointcut=“bean(*Service)” />
@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;
<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;
コンテナ自動登録の空
Reference
この問題について([Spring] DI), 我々は、より多くの情報をここで見つけました https://velog.io/@betty214/Spring-DIテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol