2

Я использую 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-тип типа [...]. «.

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

+0

Не совсем обходной путь для проблемы, но вместо использования '@ Configurable' вы можете просто ввести фабрику в свой компонент. –

ответ

3

Я нашел один обходной путь к этому. Для инициализации AnnotationBeanConfigurerAspect аспект до @PostConstruct выполняется вы можете добавить следующую аннотацию к классу с таким методом @PostConstruct:

@DependsOn("org.springframework.context.config.internalBeanConfigurerAspect") 

Надежда эта информация будет полезна для кого-то.

+0

Если вы считаете, что это правильный ответ, вы можете принять свой собственный ответ, чтобы закрыть вопрос. – kriegaex