gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:35:55 25 4
gpt4 key购买 nike

我通过编译时编织将 Spring 与 AspectJ 结合使用,以便为非容器管理的对象使用 @Configurable spring 注释。

这是一个带有@Configurable 注释的对象示例:

@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;
}
}

我要注入(inject)到这个对象中的组件:

@Component
public class TestComponent {}

当我在创建上下文后创建 TestConfigurable 时,TestComponent 注入(inject)正常,但是当我从 @PostConstruct-annotated 方法这样做时,它不会 Autowiring 。

带有@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

那么是否有任何变通方法可以将依赖项注入(inject)到在@PostConstruct 方法中创建的@Configurable 对象中?所有@Component 注释的 bean 都已经在上下文中并且已经及时为它们完成了 Autowiring 当调用@PostConstruct 时。为什么 Spring 不在这里进行 Autowiring ?..

可以发布其他配置文件(上下文和 pom.xml),如果它们有助于解决问题的话。

更新 1:看来我找到了问题的原因。用@Configurable 注释的对象由实现 BeanFactoryAware 的 AnnotationBeanConfigurerAspect 初始化。这个方面使用 BeanFactory 来初始化 bean。看起来 TestPostConstruct 对象的 @PostConstruct 方法在 BeanFactory 设置为 AnnotationBeanConfigurerAspect 之前执行。如果记录器设置为调试,则以下消息将打印到控制台:“BeanFactory 尚未设置...:确保此配置器在 Spring 容器中运行。无法配置 [...] 类型的 bean。继续无需注入(inject)。”

是否有任何解决方法的问题对我来说仍然悬而未决......

最佳答案

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

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

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

关于spring - @Configurable 不适用于在@PostConstruct 方法中初始化的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27230446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com