2015-04-17 12 views
5

Ich versuche, einen einfachen String zu meinem Spring-Anwendungskontext hinzuzufügen und ihn dann automatisch an eine andere vorhandene Bean (A) innerhalb des Anwendungskontextes anzuhängen. Ich weiß, dass dies nicht der übliche Weg ist, aber ich muss programmatisch viele Beans hinzufügen, was meine XML-Konfiguration sonst sehr groß machen würde.Programmgesteuertes Hinzufügen von Beans zur Spring-Anwendung Kontext

public class MyPostProcessor implements BeanFactoryPostProcessor, Ordered { 

    @Override 
    public int getOrder() { 
    return 0; 
    } 

    @Override 
    public void postProcessBeanFactory(
     ConfigurableListableBeanFactory beanFactory) throws BeansException { 
    beanFactory.registerSingleton("myString", "this is the String"); 
    A a = beanFactory.getBean(A.class); 
    beanFactory.autowireBean(a); 
    } 
}  

public class A { 

    @Autowired 
    public transient String message; 

} 

Wenn dies ausgeführt wird, die Eigenschaft message der Instanz von A ist null. Was vermisse ich?

EDIT: Das ist mein Anwendungskontext:

@Configuration 
class TestConfig { 

    @Bean 
    public A a() { 
    return new A(); 
    } 

    @Bean 
    public MyPostProcessor postProcessor() { 
    return new MyPostProcessor(); 
    } 

} 

Und das ist mein Test:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = TestConfig.class) 
public class MyTest { 

    @Autowired 
    private transient A a; 

    @Test 
    public void test() throws Exception { 
    System.err.println("Running"); 
    System.err.println("This is the autowired String: " + a.message); 
    Thread.sleep(1000); 
    } 

} 

Dank

Antwort

1

Sie sollten keine Bohnen aus BeanFactoryPostprocessors instanziieren. Von BeanFactoryPostProcessor JavaDoc:

A BeanFactoryPostProcessor mit interagieren kann und Bohnen Definitionen ändern, aber nie Instanzen Bohne. Dies kann zu einer vorzeitigen Bean-Instanziierung führen, die den Container verletzt und unbeabsichtigte Nebenwirkungen verursacht.

In Ihrem Fall wird die A Bean vor BeanPostProcessors instanziiert und daher nicht autowired.

die Linien entfernen:

A a = beanFactory.getBean(A.class); 
beanFactory.autowireBean(a); 

und arbeiten werden.

0

Versuchen Sie, die @Qualifier auf spezifische welche Bohne Sie wollen Auto Draht .

public class A { 

    @Autowired 
    @Qualifier("myString") 
    public transient String message; 

} 
+0

danke. Immer noch null. – user152468

Verwandte Themen