2015-04-17 25 views
5

我想向我的Spring應用程序上下文添加一個簡單的字符串,然後將其自動裝入到應用程序上下文中的不同現有bean(A)。我知道這不是通常的方式,但我需要以編程方式添加許多bean,否則會使我的xml配置變得非常龐大。以編程方式向Spring應用程序添加Bean上下文

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; 

} 

運行此操作時,A實例的屬性message爲空。我錯過了什麼?

編輯:這是我的應用程序上下文:

@Configuration 
class TestConfig { 

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

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

} 

這是我的測試:

@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); 
    } 

} 

感謝

回答

1

您不應該從BeanFactoryPostprocessors實例化bean。 從BeanFactoryPostProcessor的JavaDoc:

BeanFactoryPostProcessor的可交互和修改豆 定義,但從來沒有bean實例。否則可能會導致bean實例化,違反容器並導致意想不到的副作用。

對於您的情況,A bean在BeanPostProcessors之前實例化,因此不自動佈線。

刪除線:

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

,並將努力。

0

嘗試使用@Qualifier具體哪個豆你想自動線。

public class A { 

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

} 
+0

謝謝。仍爲空。 – user152468

相關問題