前に書く
SpringはIOCコンテナを介してオブジェクトを管理するのに役立ちますが、1つ以上のオブジェクトが必要なときにこれらの管理対象オブジェクトを取得するにはどうすればよいですか?これはオブジェクトの注入に関連しています。注入により、Springコンテナから取得できます。オブジェクトの逆パッシブ取得、次に、これらのオブジェクトの機能を使用してタスクを完了できます。
1:セッターメソッド注入
1.1:注入されたクラスを定義する
public class MyDao {
}
1.2:注入されたクラスを定義する
public class MyAction {
private MyDao myDao;
public MyDao getMyDao() {
return myDao;
}
public void setMyDao(MyDao myDao) {
this.myDao = myDao;
}
}
1.3:xmlを定義する
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myDao" class="yudaosourcecode.spring.MyDao"/>
<bean id="myAction" class="yudaosourcecode.spring.MyAction">
<property name="myDao" ref="myDao"/>
</bean>
</beans>
1.4:テスト
@Test
public void testDiBySetter() {
ApplicationContext ac =
new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
MyAction myAction = ac.getBean("myAction", MyAction.class);
System.out.println("myAction.getMyDao(): ");
System.out.println(myAction.getMyDao());
}
実行:
myAction.getMyDao():
yudaosourcecode.spring.MyDao@75881071
2:コンストラクター注入
2.1:注入されたクラスを定義する
public class DiPerson {
}
public class DiUser {
}
2.2:注入されたクラスを定義する
public class ConstructorDi {
public DiPerson diPerson;
public DiUser diUser;
public ConstructorDi(DiPerson diPerson, DiUser diUser) {
this.diPerson = diPerson;
this.diUser = diUser;
}
}
それらを注意private DiPerson diPerson
してprivate DiUser diUser
、私たちは、読み取りおよび書き込みメソッドを定義しません。
2.3:xmlを定義する
<beanid="myPerson" class="yudaosourcecode.spring.DiPerson"/>
<bean id="myUser" class="yudaosourcecode.spring.DiUser"/>
<bean id="constructorDi" class="yudaosourcecode.spring.ConstructorDi">
<!--
public ConstructorDi(DiPerson diPerson, DiUser diUser) {
this.diPerson = diPerson;
this.diUser = diUser;
}
-->
<constructor-arg index="0" ref="myPerson"/>
<constructor-arg index="1" ref="myUser"/>
</bean>
2.4:テスト
@Test
public void diByConstructorTest() {
ClassPathXmlApplicationContext ac
= new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
ConstructorDi constructorDi = ac.getBean("constructorDi", ConstructorDi.class);
System.out.println("constructorDi.diPerson is: ");
System.out.println(constructorDi.diPerson);
System.out.println("constructorDi.diUser is: ");
System.out.println(constructorDi.diUser);
}
出力:
constructorDi.diPerson is:
yudaosourcecode.spring.DiPerson@7403c468
constructorDi.diUser is:
yudaosourcecode.spring.DiUser@43738a82
Process finished with exit code 0
3:静的ファクトリメソッド注入
このメソッドは、実際には特定のクラスの静的メソッドを呼び出して、注入に必要なオブジェクトを取得しています。
3.1:注入されたクラスを定義する
public class DiPerson {
}
3.2:静的ファクトリクラスを定義する
静的ファクトリクラスは、DiPerson
オブジェクトを返す静的メソッドを提供します。
public class StaticFactoryCls {
public static final DiPerson generatePersonDi() {
return new DiPerson();
}
}
3.3:注入されたクラスを定義する
public class StaticFactoryMethodDi {
private DiPerson diPerson;
public DiPerson getDiPerson() {
return diPerson;
}
public void setDiPerson(DiPerson diPerson) {
this.diPerson = diPerson;
}
}
3.4:xmlを定義する
<!-- 通过工厂方法定义bean -->
<bean id="staticFactoryDiPerson" class="yudaosourcecode.spring.StaticFactoryCls" factory-method="generatePersonDi"/>
<bean id="staticFactoryMethodDi" class="yudaosourcecode.spring.StaticFactoryMethodDi">
<property name="diPerson" ref="staticFactoryDiPerson"/>
</bean>
3.5:テスト
staticFactoryMethodDi.getDiPerson() is:
yudaosourcecode.spring.DiPerson@67b467e9
Process finished with exit code 0
4:インスタンスファクトリメソッドインジェクション
このメソッドと静的ファクトリメソッドインジェクションの唯一の違いは、オブジェクトを生成するメソッドが静的メソッドではなくインスタンスメソッドであることです。
4.1:注入されたクラスを定義する
public class DiPerson {
}
4.2:インスタンスファクトリクラスを定義する
public class InstanceFactoryCls {
public DiPerson generatePersonDi() {
return new DiPerson();
}
}
ここでのメソッドはインスタンスメソッドであり、静的メソッドではないことに注意してください。
4.3:注入されたクラスを定義する
public class InstanceFactoryMethodDi {
private DiPerson diPerson;
public DiPerson getDiPerson() {
return diPerson;
}
public void setDiPerson(DiPerson diPerson) {
this.diPerson = diPerson;
}
}
4.4:xmlを定義する
<!-- 定义实例工厂bean -->
<bean id="instanceFactoryCls" class="yudaosourcecode.spring.InstanceFactoryCls"/>
<!-- 通过实例工厂bean获取需要DI的bean -->
<bean id="instanceFactoryDiPerson"
factory-bean="instanceFactoryCls"
factory-method="generatePersonDi"/>
<bean id="instanceFactoryMethodDi" class="yudaosourcecode.spring.InstanceFactoryMethodDi">
<property name="diPerson" ref="instanceFactoryDiPerson"/>
</bean>
4.5:テスト
@Test
public void diByInstanceFactoryTest() {
ClassPathXmlApplicationContext ac
= new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
InstanceFactoryMethodDi instanceFactoryMethodDi = ac.getBean("instanceFactoryMethodDi", InstanceFactoryMethodDi.class);
System.out.println("instanceFactoryMethodDi.getDiPerson() is: ");
System.out.println(instanceFactoryMethodDi.getDiPerson());
}
実行:
instanceFactoryMethodDi.getDiPerson() is:
yudaosourcecode.spring.DiPerson@5c072e3f
Process finished with exit code 0