2016-10-25 12 views
0

Я пытаюсь ввести новый компонент к существующему проектуНачало Spring @Autowired и @postconstuct работа

Текущий боб

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

} 

И я пытаюсь добавить новую Bean в 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 метод

И все эти пакеты упакованы в баночке и контекст весной 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> 

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

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, она будет развернута правильно, но post construct никогда не вызывается, поскольку она больше не является компонентом.

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

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

+0

К сожалению, не зная, что может создать возможную циклическую ссылку. Одна заключительная мысль: удалите явное определение bean-компонента в вашем файле контекста, добавьте аннотацию '@ Component' к bean-компоненту, поскольку она уже находится в области сканирования компонентов, и пусть весна делает все возможное :) (удалил мой вводящий в заблуждение ответ) – meistermeier

+0

отправляя его здесь, я попробовал. Но не повезло –

ответ

0

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

Try с

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> 
+0

Вы пытались добавить в xml config и удалить w.x.y.z.pkgB из сканирования компонентов, поскольку сканировать нечего. –

+0

Да. Я попробовал это. Но такая же ошибка –

+0

У вас есть bean с именем 'context'? Spring не может создать этот компонент при инициализации 'beanA' –