2014-10-07 2 views
2
@Component 
public class BeanA { 
... 
} 


@Component 
public class BeanB { 

    @Autowired 
    BeanA beanA; 

    public BeanB() { 
     // Use beanA 
     beanA.method(); 
    } 
} 

Можно ли предположить, что BeanA создан и инициализирован до вызова конструктора BeanB? (Я знаю, что мы можем передать BeanA в качестве конструктора arg to BeanB, это более любопытный вопрос, чтобы понять последовательность инициализации весны/java)Spring Bean: Атрибут autwired инициализирован перед конструктором?

ответ

1

Посмотрите на http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#beans-autowired-annotation-qualifiers

Настройка свойств на боб будет происходить после того, как она строится с помощью конструктора или метода фабрики. По умолчанию бобы автоматически отбираются по имени, а значения устанавливаются с использованием методов setter. Поэтому в вашем случае поле будет установлено после конструктора.

Это потому, что

@Autowired 
BeanA beanA; 

на самом деле означает, что вы хотите autowire в поле этого экземпляра класса. beanA в вашем случае не является конструктором arg. (? Ну, вот быстрый вопрос, имена аргументов конструктора нераспределенных после компиляции Есть ли флаг отладки, связанный с этим?)

В этом примере из spring documentation говорит, вы можете применить @Autowired к конструкторам и полям:

public class MovieRecommender { 

    @Autowired 
    private MovieCatalog movieCatalog; 

    private CustomerPreferenceDao customerPreferenceDao; 

    @Autowired 
    public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) { 
     this.customerPreferenceDao = customerPreferenceDao; 
    } 

    // ... 

} 

Сообщите мне, если вам нужна помощь.

О, и только незначительная точка. Кажется, вы вызываете метод() в beanA в своем конструкторе. Это не очень хорошая идея, если метод можно переопределить. Я знаю, что это всего лишь пример того, что ты записал здесь дюн, но просто предостережение.

1

Нет, весна очень умная, но не такая волшебная ... Внутренняя, весна:

  • создает экземпляр
  • набора экземпляры свойств
  • хранит в конечном итоге боб в соответствующей области видимости (кроме мазута для прототипа фасоли) и/или передает его абонент

Но создание использует конструктор и в то время, когда оно называется свойствами, не было установлено.

0

Нет, автоустановка обрабатывается BeanPostProcessor, который будет запускаться после конструктора только что созданного компонента. Если по какой-то причине вам необходимо автоподлить некоторые поля, а затем запустить некоторую инициализацию, вы можете использовать аннотированный метод @PostConstruct. Он будет вызываться после ввода всех зависимостей. В большинстве случаев @Autowiring конструктор (и, возможно, делает объект неизменным) по-прежнему является лучшим вариантом.

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