2016-06-06 2 views
-1

Рассмотрим код:Зачем автоматически обрабатывать поля через autowireCapableBeanFactory?

public class MyClass { 
    @Autowired 
    private SomeInterface variable; 

    public void init(ServletContext servletContext) { 
     WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); //debug point here 
     context.context.getAutowireCapableBeanFactory().initializeBean(this, getClass().getSimpleName()); 
    } 
} 

Когда я остаюсь при отладке автоматического связывания выполняет нормально, но когда я ставлю точку отладки прочь я NPE в variable. Кажется, что Весна выполняет асинхронную автоустановку. Есть ли способ гарантировать, что после того, как все поля будут инициализированы?

Примечание

Да вызов initializeBean(this, getClass().getSimpleName()) это не лучшая практика использования пружинного, но у меня нет другого пути, потому что класс экземпляра в другой библиотеке, которая не используется Spring.

+1

Вы должны использовать 'SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext (this);' а не 'initializeBean'. –

ответ

0

Как уже упоминалось в комментариях, лучше использовать SpringBeanAutowiringSupport вместо AutowireCapableBeanFactory.

import org.springframework.beans.factory.annotation.Configurable; 
import org.springframework.web.context.support.SpringBeanAutowiringSupport; 

@Configurable 
public class MyClass { 
    @Autowired 
    private SomeInterface variable; 

    public void init(ServletContext servletContext) { 
     SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this); 
    } 
} 

Не забывайте о @Configurable и <context:spring-configured/>. Полный пример: here

+0

Вам не нужно «@ Configurable». –

+0

Почему бы и нет? – Cherry

+0

Не нужно работать 'processInjectionBasedOnCurrentContext'. Если вам это не понадобится для чего-то еще ... –

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

  • Нет связанных вопросов^_^