2015-04-17 2 views
5

Я пытаюсь добавить простую строку в контекст приложения Spring, а затем автоустанавливаю ее на другой существующий компонент (A) в контексте приложения. Я знаю, что это не обычный способ, но мне нужно добавить много бобов программно, что в противном случае сделало бы мою xml-конфигурацию огромной.Программируемое добавление компонента Beans to Spring Context

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; 

} 

При выполнении этого свойства message экземпляра А равна нулю. Что мне не хватает?

EDIT: это мой контекст приложения:

@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

Вы не должны создавать экземпляры beans from BeanFactoryPostprocessors. От BeanFactoryPostProcessor JavaDoc:

BeanFactoryPostProcessor может взаимодействовать с и модифицировать определения компонентов- , но никогда экземпляры бина. Это может привести к преждевременному созданию экземпляра bean-фактуры , нарушению контейнера и возникновению непреднамеренных побочных эффектов .

В вашем случае фасоль A создается до BeanPostProcessors и поэтому не автопокрывается.

Удалить строки:

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

И будет работать.

0

Попробуйте использовать @Qualifier к конкретным какой боб вы хотите Авто провода ,

public class A { 

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

} 
+0

спасибо. Все еще null. – user152468

Смежные вопросы