Я использую Spring с AspectJ через компиляцию во время использования, чтобы использовать @Configurable Spring annotation для объектов, не управляемых контейнером.@Configurable не работает для объектов, инициализированных в методах @PostConstruct
Вот пример @ Настраиваемый аннотированный объекта:
@Configurable(autowire = Autowire.BY_TYPE)
public class TestConfigurable {
private TestComponent component;
public TestComponent getComponent() {
return component;
}
@Autowired
public void setComponent(TestComponent component) {
this.component = component;
}
}
компонент, который я инъекционного в этот объект:
@Component
public class TestComponent {}
Когда я создаю TestConfigurable после создания контекста TestComponent закачиваемой там нормально но когда я делаю это из @ PostConstruct-аннотированного метода, это не происходит.
Компонент с @PostConstruct:
@Component
public class TestPostConstruct {
@PostConstruct
public void initialize() {
TestConfigurable configurable = new TestConfigurable();
System.out.println("In post construct: " + configurable.getComponent());
}
}
Приложение, которое я выполнения:
public class TestApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
applicationContext.registerShutdownHook();
TestConfigurable configurable = new TestConfigurable();
System.out.println("After context is loaded: " + configurable.getComponent());
}
}
Вот выход производит это приложение:
In post construct: null
After context is loaded: [email protected]
Так есть ли обходной путь для встраивания зависимостей в @Configurable объекты, которые являются cre ated внутри методов @PostConstruct? Все @ Компонентные аннотированные бобы уже находятся в контексте, и для них уже сделано аутоописание во время вызова @PostConstruct. Почему Spring не делает автоподдержки здесь? ..
Можно отправить другие файлы конфигурации (контекст и pom.xml), если они помогут решить проблему.
Обновление 1: Похоже, я нашел причину проблемы. Объекты, аннотированные с @Configurable, инициализируются AnnotationBeanConfigurerAspect, который реализует BeanFactoryAware. В этом аспекте BeanFactory используется для инициализации компонентов. Похоже, метод @PostConstruct объекта TestPostConstruct выполняется до того, как BeanFactory настроен на AnnotationBeanConfigurerAspect. Если логгер установлен для отладки, на консоль выводится следующее сообщение: «BeanFactory не установлен ...: убедитесь, что этот конфигуратор работает в контейнере Spring. Невозможно настроить bean-тип типа [...]. «.
вопрос, если есть какие-либо обходной путь остается открытым для меня ...
Не совсем обходной путь для проблемы, но вместо использования '@ Configurable' вы можете просто ввести фабрику в свой компонент. –