Spring IOC вложенный компонент в значении свойства переопределения шаблона

1

У меня есть 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>

но, как и вложенная фасоль, я не знаю, как ее ссылать...

ОБНОВИТЬ

Я могу использовать только декларативную конфигурацию...

большое спасибо..

  • 0
    Вы не можете получить доступ к вложенному бину.
  • 0
    Почему бы не сделать общедоступным (без вложений) и создать прототип вложенного бина? «Возможно» (я не уверен), будучи абстрактным, это позволяет ребенку отвергать это
Теги:
spring
inversion-of-control

1 ответ

4
Лучший ответ

Проверьте это решение с помощью 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 и переопределение родительского определения вложенного компонента

  • 0
    мне разрешено просто использовать декларативную конфигурацию.
  • 0
    Ух ты спасаешь это работает как шарм ... большое спасибо за потраченное время ....

Ещё вопросы

Сообщество Overcoder
Наверх
Меню