E se sì quale configurazione è necessaria? Non è raccomandato?È possibile iniettare un bean definito con @Component come argomento su un oggetto BeanFactoryPostProcessor?
La classe annotata:
package com.springbug.beanfactorydependencyissue;
import javax.annotation.Resource;
import org.springframework.stereotype.Component;
@Component
public class DependantBean {
@Resource
DependencyBean dependencyBean; // Isn't initialized correctly
public DependencyBean getDependencyBean() {
return dependencyBean;
}
}
Il fagiolo dipendenza che non riesce:
package com.springbug.beanfactorydependencyissue;
import org.springframework.stereotype.Component;
@Component
public class DependencyBean {
}
Testcase:
package com.springbug.beanfactorydependencyissue;
import static org.fest.assertions.Assertions.assertThat;
import javax.annotation.Resource;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.Test;
import com.springbug.beanfactorydependencyissue.DependantBean;
@ContextConfiguration(locations = "/applicationContext.xml")
public class AppTest extends AbstractTestNGSpringContextTests {
@Resource
private DependantBean annotatedBean;
@Test
public void testThatDependencyIsInjected() {
// Fails as dependency injection of annotatedBean.dependencyBean does not work
assertThat(annotatedBean.getDependencyBean()).isNotNull();
}
}
Una consuetudine BeanFactoryPostProcessor con la dipendenza "difettosa":
package com.springbug.beanfactorydependencyissue;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeanFactoryPostProcessorConfiguration {
/**
* The {@link DependantBean} here causes the bug, can
* {@link BeanFactoryPostProcessor} have regular beans as dependencies?
*/
@Bean
public static BeanFactoryPostProcessor beanFactoryPostProcessor(
DependantBean dependantBean) {
return new BeanFactoryPostProcessor() {
public void postProcessBeanFactory(
ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}
};
}
}
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<context:component-scan base-package="com.springbug.beanfactorydependencyissue" />
</beans>
Perché non BeanFactoryPostProcessorConfiguration
riferimento DependantBean
?
L'istanza risultante in AppTest
non è nullo, cioè è stato creato da primavera, ma le sue dipendenze (DependencyBean
) sono nulle. Il fatto che Spring non si lamenta del tutto mi porta a credere che questo sia un bug entro la primavera. Questo caso d'uso dovrebbe essere supportato o no?
Btw, sto usando spring - * - 3.1.1.RELEASE.jar Btw 2: il codice per riprodurre il bug può anche essere trovato here.
C'è qualcosa di strano in CommonAnnotationBeanPostProcessor. Puoi passare alle annotazioni @Autowired invece di @Resource? Aiuta? –
Buona teoria ma myDependency è ancora nullo. Sono sorpreso che la primavera lo mangi e continui senza nemmeno riportare un'iniezione fallita. – jontejj
Quando funziona 'ApplicationContextAwareProcessor AbstractApplicationContext $ BeanPostProcessorChecker ConfigurationClassPostProcessor $ ImportAwareBeanPostProcessor CamelBeanPostProcessor CoreNamespacePostProcessor CommonAnnotationBeanPostProcessor AutowiredAnnotationBeanPostProcessor RequiredAnnotationBeanPostProcessor AbstractApplicationContext $ ApplicationListenerDetector' registrati come processori di fagioli, ma quando lo fa non solo' ApplicationContextAwareProcessor' è registrato. – jontejj