Skip to content

Механизмы создания объектов через di

wizardjedi edited this page Jan 24, 2013 · 10 revisions

Создание "анонимного" объекта

new org.namespace.Class1();
<bean class="org.namespace.Class1">

Создание объекта "с именем"

Class1 class1 = new Class1();
<bean id="class1" class="org.namespace.Class1" />

Задание свойств объекта

Class1 class1=new Class1();
class1.setId(1);
class1.setStringValue("String value");
<bean id="class1" class="org.namespace.Class1">
	<property name="id" value="1" />
	<property name="stringValue" value="String value" />
</bean>

сокращённый вариант с использованием p-namespace

<bean id="class1" class="org.namespace.Class1" p:id="1" p:stringValue="String value" />

Создание объекта с заданием свойств через конструктор

// public Class1(Long id, String stringValue) {
Class1 class1 = new Class1(1,"String value");
<bean id="class1" name="org.namespace.Class1">
	<constructor-arg name="id" value="1" /><!-- инъекция по имени -->
	<constructor-arg index="1" name="stringValue" value="1" /><!-- инъекция по номеру аргемента -->
</bean>

сокращённая форма через c-namespace

<bean id="class1" name="org.namespace.Class1" c:id="1" c:stringValue="1" />

Внедрение объектов друг в друга через методы установки

Class1 class1 = new Class1();
Class2 class2 = new Class2();

class1.setProperty1(class2);
class2.setProperty2(new Class3());
<bean id="class2" class="org.namespace.Class2" />
<bean id="class1" class="org.namespace.Class1">
	<property name="property1" ref="class2">
	<!- или -->
	<property name="property1">
		<ref>class2</ref>
	</property>

	<property name="property2">
		<bean class="org.namespace.Class3" />
	</property>
</bean>

сокращённая запись через p-namespace

<bean id="class2" class="org.namespace.Class2" />
<bean id="class1" class="org.namespace.Class1" p:property1-ref="class2">
	<property name="property2">
		<bean class="org.namespace.Class3" />
	</property>
</bean>

Внедрение объектов друг в друга с использованием конструктора

Class2 class2 = new Class2();
Class1 class1 = new Class1(class2, new Class3());
<bean id="class2" class="org.namespace.Class2" />
<bean id="class1" class="org.namespace.Class1">
	<constructor-arg index="0">
		<ref>class2</ref>
	</constructor-arg>
	<!-- или -->
	<constructor-arg index="0" ref="class2">

	<constructor-arg index="1">
		<bean class="org.namespace.Class3" />
	</property>
</bean>

Сокращённая запись через c-namespace

<bean id="class2" class="org.namespace.Class2" />
<bean id="class1" class="org.namespace.Class1" c:arg1-ref="class2">
	<constructor-arg index="1">
		<bean class="org.namespace.Class3" />
	</property>
</bean>

Задание элементов коллекций

Class1 class1 = new Class1();
List<Long> col = new List<Long>();
col.add(1);
col.add(2);
col.add(3);
class1.setListProperty(col);
<bean id="class1" class="org.namespace.Class1">
	<property name="listProperty">
		<list>
			<value>1</value>
			<value>2</value>
			<value>3</value>
		</list>
	</property>
</bean>

Создание бинов через фабричный метод

public class FabricClass {
	public Class1 getClassInstance()
	{
		Class1 c= new Class1();
		
		c.setName("Created at"+(new Date()).toString());
		
		return c;
	}
}
...
FabricClass fc = new FabricClass();
Class1 class2 = fc.getClassInstance();
<bean id="factory" class="a1s.learn.FabricClass" />

<bean id="class1" class="a1s.learn.Class1" factory-bean="factory" factory-method="getClassInstance" />

Создание объекта через статичный фабричный метод класса фабрики

public class FabricClass {
	public static Class1 getClassInstance()
	{
		Class1 c= new Class1();
		
		c.setName("Created at"+(new Date()).toString());
		
		return c;
	}
}
...
Class1 class1 = FabricClass.getClassInstance();
<bean id="class1" class="a1s.learn.FabricClass" factory-method="getClassInstance" />

Адресация к статическим полям класса

Class1 class1 = new Class1();
class1.setFloatProperty(java.lang.Math.PI);
<bean id="class1" class="a1s.learn.Class1">
	<property name="floatProperty">
		<util:constant static-field="java.lang.Math.PI" />
	</property>
</bean>

Или с использованием SpEL

<bean id="class1" class="a1s.learn.Class1">
	<property name="floatProperty" value="#{T(java.lang.Math).PI}" />
</bean>

Задание null значений

Class1 class1 = new Class1();
class1.setFloatProperty(null);
<bean id="class1" class="a1s.learn.Class1">
	<property name="floatProperty">
		<null />
	</property>
</bean>

Наследование установки свойств для бинов

Допустим есть множество бинов, в которые сетятся одинаковые значения. Например, множество DAO-объектов, в которые нужно засетить datasource. В таком случае можно объявить бин (как абстрактный abstract="true"), в который установлено необходимое свойство и в нужных бинах сослаться на этот бин через атрибут parent="parentBean".

TODO: parent для bean'ов

Clone this wiki locally