injection framework dependency context bean application annotation java spring dependency-injection

java - framework - Cómo conectar frijoles interdependientes en primavera?



spring framework (4)

Quiero declarar dos beans e instanciarlos usando la inyección de dependencia Spring?

<bean id="sessionFactory" class="SessionFactoryImpl"> <property name="entityInterceptor" ref="entityInterceptor"/> </bean> <bean id="entityInterceptor" class="EntityInterceptorImpl"> <property name="sessionFactory" ref="sessionFactory"/> </bean>

Pero Spring lanza una excepción diciendo "FactoryBean que está actualmente en creación devuelto nulo de getObject"

¿Por qué el cableado de frijol interdependiente no funciona aquí? ¿Debo especificar la propiedad defferred vinculante en cualquier lugar?


Desafortunadamente, la forma en que la inicialización del contenedor funciona en Spring, un bean solo se puede inyectar en otro bean una vez que se haya inicializado por completo. En su caso, tiene una dependencia circular que impide que cualquiera de los beans se inicialice porque dependen el uno del otro. Para evitar esto, puede implementar BeanFactoryAware en uno de los beans y obtener la referencia al otro bean usando beanFactory.getBean ("beanName").



neesh tiene razón, Spring no hace esto de la caja.

Los frijoles interdependientes apuntan a un problema de diseño. La forma "limpia" de hacerlo es rediseñar sus servicios de tal manera que no existan dependencias tan extrañas, por supuesto, siempre que tenga control sobre las implementaciones.


puede extender el ApplicactionContext que está utilizando y anular el método createBeanFactory ()

protected DefaultListableBeanFactory createBeanFactory(){ DefaultListableBeanFactory beanFactory = super.createBeanFactory(); // By default this is false; beanFactory.setAllowRawInjectionDespiteWrapping( true ); return beanFactory; }

Esto funciona, pero tenga cuidado porque esto permite referencias circulares.