Вам не хватает фундаментальной детали, которую свойства вводят после создания бина?Вы пытались получить доступ к своей собственности после полной инициализации компонента?
Обновление: Я немного переделал ваш пример, чтобы продемонстрировать разницу:
@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
метод вызывается