@Configurable不适用于在@PostConstruct方法中初始化的对象

时间:2014-12-01 14:24:18

标签: spring aspectj configurable postconstruct compile-time-weaving

我通过编译时编织将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。没有注射。“

是否有任何解决方法的问题仍然对我开放......

1 个答案:

答案 0 :(得分:4)

我找到了一个解决方法。要在执行@PostConstruct之前初始化AnnotationBeanConfigurerAspect方面,可以使用这样的@PostConstruct方法将以下注释添加到类中:

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

希望这些信息对某人有用。