-
Notifications
You must be signed in to change notification settings - Fork 56
Механизмы создания объектов через 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>
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'ов