Spring - бин @Autowired из @Configuration равен нулю - PullRequest
0 голосов
/ 28 ноября 2018

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

Appconfiguration.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);
    }
}

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

1 Ответ

0 голосов
/ 29 ноября 2018

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

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

@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 метод вызывается

...