Spring - @Autowired bean-компонент из @Configuration имеет значение null

Я определяю компонент в классе конфигурации. Я хотел бы автоматически подключить этот компонент к компоненту. Однако свойство остается нулевым. Например.:

Конфигурация приложения.java

@Configuration
public class AppConfiguration {

    @Bean
    public SomeType someObject() {
        return new SomeType();
    }
}

AppComponent.java

@Component
public class AppComponent {

    @Autowired
    private SomeType someObject;  // TODO why null?

    public AppComponent() {  // note: passing a SomeType constructor argument works
        System.out.println(someObject);
    }
}

Как я могу автоматически связать bean-компонент, определенный в классе конфигурации?


person nagy.zsolt.hun    schedule 28.11.2018    source источник


Ответы (1)


Вам не хватает фундаментальной детали, что свойства внедряются после создания bean-компонента? Вы пытались получить доступ к своей собственности после полной инициализации компонента?

Обновление: я немного переработал ваш пример, чтобы продемонстрировать разницу:

@Test
public void initializationTest() {
    try (AnnotationConfigApplicationContext context =
                 new AnnotationConfigApplicationContext()) {
        context.register(AppConfiguration.class, AppComponent.class);
        context.refresh();
    }
}

@Configuration
public class AppConfiguration {

    @Bean
    public SomeType someObject() {
        return new SomeType();
    }
}


@Component
public class AppComponent {

    @Autowired
    private SomeType someObject;

    public AppComponent() {
        // Here properties are not yet injected by Spring IoC container
        System.out.println(someObject); // Obviously prints null
    }

    /**
     * Method is invoked after a bean is initialized and all its properties are being set.
     */
    @PostConstruct
    private void init() {
        System.out.println(someObject); // Prints SomeType@6b419da
    }
}

public class SomeType {
}

Таким образом, в основном жизненный цикл компонента состоит из следующих шагов:

1. Создается экземпляр компонента
2. Задаются свойства компонента
3. В случае, если компонент реализует Aware интерфейсов, эти реализованные методы вызываются
4. Вызываются BeanPostProcessor#postProcessBeforeInitialization метода пользовательских постпроцессоров компонентов
5. Обратные вызовы инициализации вызываются в следующем порядке:
5.1. вызывается метод @PostConstruct
5.2. вызывается метод InitializingBean#afterPropertiesSet()
5.3. Вызывается @Bean#initMethod() метод
Бин теперь полностью инициализирован.
6. Вызывается BeanPostProcessor#postProcessAfterInitialization методов пользовательских постпроцессоров.
7. Обратные вызовы уничтожения вызываются в следующем порядке. :
7.1. вызывается метод @PreDestroy
7.2. вызывается метод DisposableBean#destroy()
7.3. вызывается метод @Bean#destroyMethod

person Laplas    schedule 28.11.2018