3、Beanのライフサイクル継続

14233 ワード

1、前編のApp 1を以下のように修正する.
package com.cdtax.beanlife;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

public class App1
{
	public static void main(String[] args)
	{
//		ApplicationContext ac = new ClassPathXmlApplicationContext("com/cdtax/beanlife/beans.xml");
		BeanFactory factory = new XmlBeanFactory(new ClassPathResource("com/cdtax/beanlife/beans.xml"));
		
		PersonService ps = (PersonService)factory.getBean("personService");
		
		ps.sayHi();
	}
}

beanファクトリ方式を使用して、実行結果:
非パラメトリックコンストラクション関数呼び出しsetName呼び出しsetBeanNameのarg 0:personService setBeanFactory:org.springframework.beans.factory.xml.XmlBeanFactory@453807: defining beans [personService,personService2,myBeanPostProcessor]; root of factory hierarchy afterPropertiesSet自分のinit()hello小明を呼び出されました
工場方式を使用すると、多くの過程が少なくなり、具体的には工場方式の下でbeanのライフサイクルは下図のようになります.
2、Beanを組み立てる
Spring容器内でbeanをパッチワークすることをアセンブリといい、beanをアセンブリするときは、容器にどのbeanを使用するか、容器に依存注入をどのように使用するかを教える必要があります.
きほんくみたて
2.1)XMLアセンブリの使用
xmlは最も一般的なspringアプリケーションシステムのアセンブリソースです.いくつかのspringコンテナでは、xmlアセンブリbeanの使用がサポートされています.
(1)XmlBeanFactory:ClassPathResourceを呼び出してコンテキスト定義ファイル(applicationContext.xmlなど)を読み込む(2)ClassPathXmlApplicationContext:クラスパスからコンテキスト定義ファイルを読み込む(3)XmlWebApplicationContext:Webアプリケーションコンテキストから定義ファイルを読み込む
コンテキスト定義ファイルのルート要素はには複数のサブ要素があります.各要素は、springコンテナにbeanがどのようにアセンブリされるかを定義します.
beanの最も基本的な構成には、beanのIDとその全称クラス名が含まれます.beanのidはfoo
2.2)基本組立-scope
prototype、singleton、request、session、global-session、springのbeanはデフォルトでは単例モードであり、常に1つのインスタンスを返し、異なるインスタンスを返すにはプロトタイプモードを定義する必要があります.
beanのsingletonプロパティは、コンテキストがbeanが単一の例であるかどうかを示し、デフォルトはtrueであり、falseであればプロトタイプbeanである.

プロトタイプbeanの使用はパフォーマンスに影響します.必要でない限りprototypeに設定しないでください.
インスタンス化と破棄:springがbeanをインスタンス化または破棄する場合、いくつかの処理が必要になる場合があります.そのため、springはbeanの作成と分解時にbeanの2つのライフサイクルメソッドを呼び出すことができます.
xmlファイルでカスタマイズされたinitメソッドとdestroyメソッドを構成しない場合は、どのメソッドがinit-methodであるかを注釈で構成することもできます.
@PostConstruct-指定initと@PreDestroy-指定destory
Springでは、InitializingBeanとDisposableBeanの2つのインタフェースも提供されています.InitializingBeanインタフェースはafterPropertiesSet()メソッドを提供し、DisposableBeanインタフェースが提供するstory()メソッドは、beanとspringAPIをバインドするインタフェースを推奨しません.
set法による注入依存:要素のサブ要素は、それらのset法を用いて注入することを示す.基本タイプから集合クラス、さらにはアプリケーションシステムのbeanまで、何でも注入できます.
のvalue、直接配値、ref、別のbeanへの参照、または内部クラス
3、集合タイプに値を注入する方法
JAvaの主な集合はいくつかあります:map、set、list/配列
次に、集合クラスの注入例を示します.
package com.cdtax.collection;

public class Employee
{
	private String name;
	private int id;

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}
	
}
package com.cdtax.collection;

import java.util.List;
import java.util.Map;
import java.util.Set;

public class Department
{
	private String name;
	private String[] empName;
	private List<Employee> empList;
	private Set<Employee> empSets;
	private Map<String,Employee> empMaps;
	
	
	public Map<String, Employee> getEmpMaps()
	{
		return empMaps;
	}
	public void setEmpMaps(Map<String, Employee> empMaps)
	{
		this.empMaps = empMaps;
	}
	public Set<Employee> getEmpSets()
	{
		return empSets;
	}
	public void setEmpSets(Set<Employee> empSets)
	{
		this.empSets = empSets;
	}
	public List<Employee> getEmpList()
	{
		return empList;
	}
	public void setEmpList(List<Employee> empList)
	{
		this.empList = empList;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public String[] getEmpName()
	{
		return empName;
	}
	public void setEmpName(String[] empName)
	{
		this.empName = empName;
	}
	
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<bean id="department" class="com.cdtax.collection.Department">
	<property name="name" value=" "></property>
	
	<!--   -->
	<property name="empName">
		<list>
			<value> </value>
			<value> </value>
			<value> </value>
		</list>
	</property>

	<!--  list   list -->
	<property name="empList">
		<list>
			<ref bean="emp1"/>
			<ref bean="emp2"/>
			<ref bean="emp2"/>
			<ref bean="emp2"/>
			<ref bean="emp2"/>
		</list>
	</property>
	
	<!--  set  set  -->
	<property name="empSets">
		<set>
			<ref bean="emp1"/>
			<ref bean="emp2"/>
			<ref bean="emp2"/>
			<ref bean="emp2"/>
		</set>
	</property>
	
	<!--  map   map key , bean-->
	<property name="empMaps">
		<map>
			<entry key="1" value-ref="emp1"/>
			<entry key="2" value-ref="emp2"/>
		</map>
	</property>
</bean>

<bean id="emp1" class="com.cdtax.collection.Employee">
	<property name="name" value=" "></property>
	<property name="id" value="1"></property>
</bean>
<bean id="emp2" class="com.cdtax.collection.Employee">
	<property name="name" value=" "></property>
	<property name="id" value="2"></property>
</bean>
</beans>
package com.cdtax.collection;

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App1
{
	public static void main(String[] args)
	{
		ApplicationContext ac = new ClassPathXmlApplicationContext("com/cdtax/collection/beans.xml");
		
		Department department = (Department)ac.getBean("department");
		System.out.println(department.getName());
		
		for(String empName : department.getEmpName())
		{
			System.out.println(empName);
		}
		
		System.out.println("========= list ========");
		for(Employee e : department.getEmpList())
		{
			System.out.println("name : " + e.getName());
		}
		
		System.out.println("========= Set ========");
		for(Employee e : department.getEmpSets())
		{
			System.out.println("name : " + e.getName());
		}
		System.out.println("========= map ========");
		//1、 
		Map<String,Employee> employees = department.getEmpMaps();
		Iterator it = department.getEmpMaps().keySet().iterator();
		while(it.hasNext())
		{
			String key = (String)it.next();
			Employee emp = employees.get(key);
			System.out.println("key=" + key + "  " +emp.getName());
		}
		//2、 
		for(Entry<String,Employee> entry1 :department.getEmpMaps().entrySet())
		{
			System.out.println(entry1.getKey() + " : " + entry1.getValue().getName());
		}
		
		
	}
}

実行結果:
財務部小明大明肖大明==============================name:北京name:上海=======================北京key=上海1:北京2:上海
4、配値の継承:
package com.cdtax.inherit;

public class Student
{
	protected String name;
	protected int age;
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	
}
package com.cdtax.inherit;

public class Gradate extends Student
{
	private String degree;

	public String getDegree()
	{
		return degree;
	}

	public void setDegree(String degree)
	{
		this.degree = degree;
	}
	
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!--   -->
<bean id="student" class="com.cdtax.inherit.Student">
	<property name="name" value=" "></property>
	<property name="age" value="30"></property>
</bean>

<!--  Gradate  -->
<bean id="gradate" parent="student" class="com.cdtax.inherit.Gradate">
	<!--  name,age,  -->
	
	<property name="name" value=" "></property>
	<property name="age" value="40"></property>
	<property name="degree" value=" "></property>
</bean>
</beans>
package com.cdtax.inherit;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App1
{
	public static void main(String[] args)
	{
		ApplicationContext ac = new ClassPathXmlApplicationContext("com/cdtax/inherit/beans.xml");
		
		Gradate gradate = (Gradate)ac.getBean("gradate");
		
		System.out.println(gradate.getName() + ":" + gradate.getAge()+ ":" + gradate.getDegree());
	}
}

5、propertiesを組み立てる
Departmentクラスの場合、属性を追加します:private Properties pp;///propertiesの使用
それからxmlでの構成:
<!--  Properties  -->
	<property name="pp">
		<props>
			<prop key="pp1">abcd</prop>
			<prop key="pp2">hello</prop>
		</props>
	</property>

そしてApp 1でPropertiesを取る価値を増やします.
System.out.println("========= Properties ========");
		Properties pp = department.getPp();
//		System.out.println(pp.get("pp1").toString());
		for(Entry<Object,Object> entry : pp.entrySet())
		{
			System.out.println(entry.getKey().toString() + entry.getValue().toString());
		}
		
		System.out.println("========= Enumeration properties ========");

		Enumeration en = pp.keys();
		while(en.hasMoreElements())
		{
			String key = (String)en.nextElement();
			System.out.println(key + " " +pp.getProperty(key));
		}

beanのプロパティがコレクションタイプの場合、nullを設定するには、次のようにします.

       

思考:現在はset方式でbeanに値を注入しており、springは構造関数を通じて値を注入するなど、他の方法で値を注入しています.
6、構造関数による注入値

Springコンテナはconstructor-argの個数に基づいて、パラメータの適切な構造関数を自動的に呼び出します.ここに2つある場合は、2つのパラメータの構造関数を呼び出します.2つのパラメータの構造関数がなければ、エラーが表示されます.
set注入の欠点は,どの属性が必要であるか,どの属性がオプションであるかを明確に表現できないことであり,構造注入の利点は強制依存関係を構築することによって,不完全または使用できないbeanをインスタンス化することは不可能である.
package com.cdtax.constructor;

public class Employee
{
	private String name;
	private int age;
	
	public Employee()
	{
		
	}
	
	public Employee(String name, int age)
	{
		
		this.name = name;
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns:context="http://www.springframework.org/schema/context"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
				http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">

<!--   -->
<bean id="employee" class="com.cdtax.constructor.Employee">
<!--   -->
	<constructor-arg index="0" type="java.lang.String" value=" "></constructor-arg>
	<constructor-arg index="1" type="int" value="30"></constructor-arg>

</bean>
</beans>