У меня есть template bean
которого есть вложенный bean
. Вложенные bean-компоненты имеют 2 важных свойства: тот, который действителен для остальных 3-х фанов, но имеет свойство secong, которое изменяется в каждом компоненте.
мой шаблон выглядит так. фасоль без класса.
<bean id="myBeanTemplate" abstract="true" scope="prototype">
<property name="school">
<bean class="com.model.School" scope="prototype">
<property name="status" value="true"/><!--is all the same for all the child beans..->
/*address=?? the property which is change across the children beans.. the property to be set*/
</bean>
</property>
</bean>
здесь я не устанавливаю свойство addres
только потому, что они различаются в следующем объявлении bean, все, что я хочу сделать, имеет шаблон bean выше и override the address property only
. именно так.
<bean id="myBeanForStudentsInSchool13" class="com.model.Students" parent="myBeanTemplate" scope="prototype">
here i want to set the address property to a value
</bean>
<bean id="myBeanForStudentsInSchool23" class="com.model.Students" parent="myBeanTemplate" scope="prototype">
here i want to set the address property a different value
</bean>
но, как и вложенная фасоль, я не знаю, как ее ссылать...
ОБНОВИТЬ
Я могу использовать только декларативную конфигурацию...
большое спасибо..
Проверьте это решение с помощью Java Config.
Модель школы:
public class School {
private boolean status;
private String address;
// getters & setters
}
Боб шаблон:
public abstract class MyBeanTemplate {
private School school;
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
}
Студенческий класс:
public class Students extends School {
}
Конфигурация пружины:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@Bean
public Students myBeanForStudentsInSchool13() {
Students students = new Students();
students.setAddress("myBeanForStudentsInSchool13");
return students;
}
@Bean
public Students myBeanForStudentsInSchool23() {
Students students = new Students();
students.setAddress("myBeanForStudentsInSchool23");
return students;
}
}
РЕДАКТИРОВАТЬ
Для конфигурации XML проверьте этот пример (обратите внимание на точки в дочернем компоненте):
<bean id="myBeanTemplate" abstract="true" class="com.beans.MyBeanTemplate">
<property name="school">
<bean class="com.model.School">
<property name="status" value="true"/>
</bean>
</property>
</bean>
<bean id="myBeanForStudentsInSchool13" class="com.model.Students" parent="myBeanTemplate">
<property name="school.address" value="myBeanForStudentsInSchool13"/>
</bean>
<bean id="myBeanForStudentsInSchool23" class="com.model.Students" parent="myBeanTemplate">
<property name="school.address" value="myBeanForStudentsInSchool23"/>
</bean>
Вы также можете проверить более подробный ответ здесь: spring-constructor injection и переопределение родительского определения вложенного компонента