我通过编译时编织将Aspect与AspectJ一起使用,以便对容器非托管的对象使用@Configurable spring注释。
以下是@ Configurable-annotated object的示例:
@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-annotated方法执行此操作时,它不会发生自动装配。
包含@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: paulenka.aleh.roguelike.sandbox.TestComponent@fe18270
那么有没有办法将依赖项注入@PostConstruct方法中创建的@Configurable对象?所有@Component-annotated bean已经在上下文中,并且已经及时为它们做了自动装配什么时候调用@PostConstruct。为什么Spring不在这里进行自动装配?..
可以发布其他配置文件(context和pom.xml),如果它们有助于解决问题。
更新1: 看起来我找到了问题的原因。使用@Configurable注释的对象由实现BeanFactoryAware的AnnotationBeanConfigurerAspect初始化。这方面使用BeanFactory来初始化bean。看起来在将BeanFactory设置为AnnotationBeanConfigurerAspect之前执行TestPostConstruct对象的@PostConstruct方法。如果logger设置为debug,则会向控制台输出以下消息:“尚未设置BeanFactory ...:确保此configurer在Spring容器中运行。无法配置类型为[...]的bean。没有注射。“
是否有任何解决方法的问题仍然对我开放......
答案 0 :(得分:4)
我找到了一个解决方法。要在执行@PostConstruct之前初始化AnnotationBeanConfigurerAspect方面,可以使用这样的@PostConstruct方法将以下注释添加到类中:
@DependsOn("org.springframework.context.config.internalBeanConfigurerAspect")
希望这些信息对某人有用。