2015-04-17 12 views
5

Sto tentando di aggiungere una stringa semplice al mio contesto applicazione Spring e quindi autorizzarla su un bean esistente diverso (A) all'interno del contesto dell'applicazione. So che questo non è il solito modo di andare, ma ho bisogno di aggiungere molti bean a livello di codice, il che altrimenti renderebbe enorme la mia configurazione xml.Aggiunta programmatica di bean all'applicazione Spring Contesto

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; 

} 

Quando si esegue questa operazione, la proprietà message dell'istanza di A è nullo. Cosa mi manca?

EDIT: questo è il mio contesto di applicazione:

@Configuration 
class TestConfig { 

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

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

} 

E questa è la mia prova:

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

} 

Grazie

risposta

1

Non è necessario creare un'istanza di fagioli da BeanFactoryPostprocessors. Da BeanFactoryPostProcessor JavaDoc:

Un BeanFactoryPostProcessor può interagire con fagioli e modificare definizioni, ma le istanze mai di fagioli. Ciò potrebbe causare l'anticipazione dei bean , violando il contenitore e causando effetti collaterali non desiderati .

Nel tuo caso, il bean A viene istanziato prima BeanPostProcessors e quindi non avviato automaticamente.

Rimuovere le righe:

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

e lavorerà.

0

Provare a utilizzare il @Qualifier di specifico che si desidera legare auto di fagioli .

public class A { 

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

} 
+0

grazie. Ancora null. – user152468

Problemi correlati