Получение работы Spring @Autowired и @postconstuct

Я пытаюсь ввести новый компонент в существующий проект

Текущий компонент

package w.x.y.z.pkgA
@Component
public class BeanA implements InterfaceA {

}

И я пытаюсь добавить новый Бин в w.x.y.z.pkgB

package w.x.y.z.pkgB
public class BeanB implements InterfaceB {

    @Autowired
    private BeanA beanA

    @PostConstruct
    public void postConstructMethod() {
        //Call some method in BeanA
    }
}

Из BeanB я хочу получить доступ к BeanA данным, а в конструкции поста BeanB я хочу зарегистрировать BeanB с BeanA. Итак, я хочу вызвать метод BeanA

И все эти пакеты упакованы как jar и spring context xml

<context:annotation-config />
<context:component-scan base-package="w.x.y.z.pkgA,w.x.y.z.pkgB" />
<bean id="beanb" clas="w.x.y.z.pkgB.BeanB"></bean>

Но во время развертывания я получаю исключение о bean-компоненте в состоянии создания

Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'context': Requested bean is currently in creation: Is there an unresolvable circular reference?
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:347)
at w.x.y.z.BeanA<init>(BeanA.java:25)
at w.x.y.z.BeanB.<init>(BeanB.java:35)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:147)

Я также попытался удалить @Autowired и получить объект BeanA, используя getBeanFactory().getBean(BeanA.class). Но я получаю ту же ошибку.

Если я удалю запись bean-компонента из xml-файла, он будет правильно развернут, но почтовая конструкция никогда не вызывается, поскольку она больше не является bean-компонентом.

BeanA вообще не зависит от BeanB. Нет ссылок?

Есть ли способ заставить эти @Autowired и @PostConstruct работать, когда 2 боба находятся в одной банке?


person Dheeraj Joshi    schedule 25.10.2016    source источник
comment
Извините, я понятия не имею, что может создать возможную циклическую ссылку. И последняя мысль: удалите явное определение bean-компонента в файле контекста, добавьте аннотацию @Component к bean-компоненту, поскольку он уже находится в области сканирования компонентов, и позвольте Spring сделать все возможное :) (удалил мой вводящий в заблуждение ответ)   -  person meistermeier    schedule 25.10.2016
comment
Прежде чем опубликовать это здесь, я попробовал это. Но не повезло   -  person Dheeraj Joshi    schedule 25.10.2016


Ответы (1)


Вы объявляете компонент как <bean id="beanb" clas="w.x.y.z.BeanB"> из пакета w.x.y.z.

Попробуйте с

package w.x.y.z
@Component
public class BeanA implements InterfaceA {

}


package w.x.y.z
public class BeanB implements InterfaceB {

    private BeanA beanA

    @PostConstruct
    public void postConstructMethod() {
        //Call some method in BeanA
    }

    // Getters and Setters
}

и

<context:annotation-config />
<context:component-scan base-package="w.x.y.z" />
<bean id="beanb" clas="w.x.y.z.BeanB">
    <property name="beanA" value="beanA"/> <!-- Spring will create beanA as it is annotated with @Component -->
</bean>
person Issam El-atif    schedule 25.10.2016
comment
Вы пытались добавить ‹property name=beanA value=beanA/› в конфигурацию xml и удалить w.x.y.z.pkgB из сканирования компонентов, поскольку сканировать нечего. - person Issam El-atif; 25.10.2016
comment
У вас есть боб с именем context? Spring не может создать этот компонент при инициализации beanA - person Issam El-atif; 25.10.2016
comment
Контекстный компонент — это ‹bean id=context class=org.springframework.context.support.ClassPathXmlApplicationContext› - person Dheeraj Joshi; 26.10.2016
comment
Нет необходимости определять context bean-компонент в файле конфигурации spring xml. Я попробовал ваш код, и он работает. проверьте этот github.com/ielatif/stackoverflow/tree/master/ - person Issam El-atif; 26.10.2016