Как установить родительский элемент текущего beanFactory в Spring IOC

Я просматривал весеннюю документацию IOC и наткнулся на следующий фрагмент кода:

<bean name = "messageBroker,mBroker,MyBroker" class = "com.components.MessageBroker">
    <property name = "tokenBluePrint">
        <ref parent = "tokenService" />
    </property>
</bean>

Согласно документации, родительский атрибут тега «ref» используется для ссылки на родительскую фабрику компонентов для текущей фабрики компонентов, но для установки родителя для фабрики компонентов.

Я пробовал следующий фрагмент кода. Но все же я получаю ошибку.

    String[] xmlFies=new String[1];
    xmlFies[0] = "applicationContext.xml";

    ClassPathXmlApplicationContext parentContext=new    ClassPathXmlApplicationContext("tokenConfiguration.xml");
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlFies);
    context.setParent(parentContext);
    context.getBeanFactory().setParentBeanFactory(parentContext.getBeanFactory());
    context.close();
    parentContext.close();

Ошибка :

Вызвано: org.springframework.beans.factory.BeanCreationException: ошибка создания bean-компонента с именем 'messageBroker', определенным в ресурсе пути к классу [applicationContext.xml]: не удается разрешить ссылку на bean-компонент 'tokenService' в родительской фабрике: родительская фабрика недоступна в org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference (BeanDefinitionValueResolver.java:360)

Я что-то упускаю? Пожалуйста, посмотрите.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
434
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я считаю, что проблема в том, что ваш дочерний контекст обновляется до того, как будет установлен родительский контекст.

Вот соответствующие конструкторы из ClassPathXmlApplicationContext:

// this is the constructor that 'context' is using, and refresh is defaulted to true
public ClassPathXmlApplicationContext(String... configLocations) throws BeansException {
    this(configLocations, true, null);
}

// the constructor that both others are calling
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
        throws BeansException {
    super(parent);
    setConfigLocations(configLocations);
    if (refresh) {
        // you don't want to refresh until your parent context is set
        refresh();
    }
}

// the constructor I think you should use, it will set the parent first and then refresh
public ClassPathXmlApplicationContext(String[] configLocations, ApplicationContext parent) throws BeansException {
    this(configLocations, true, parent);
}

Вместо этого я бы использовал последний конструктор, чтобы родительский контекст устанавливался до вызова refresh().

Нравится:

String[] xmlFies=new String[1];
xmlFies[0] = "applicationContext.xml";

ClassPathXmlApplicationContext parentContext = new ClassPathXmlApplicationContext("tokenConfiguration.xml");
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlFies, parentContext);
. . .

Да, вы правы, сначала обновлялся дочерний контекст. Ваше предложение сработало. Спасибо. Теперь я понимаю, что делал не так. Я пытался установить родительский контекст после обновления дочерней фабрики bean.

Thinker 09.10.2018 20:30

@Thinker Рад, что смог помочь.

xtratic 09.10.2018 20:33

Другие вопросы по теме