Java 在初始化所有spring上下文之后,有没有一种方法可以调用bean中的方法
我有一个问题,这就是问题的要点:(循环中涉及到更多的类,但可以这样表示)Java 在初始化所有spring上下文之后,有没有一种方法可以调用bean中的方法,java,spring,dependency-injection,postconstruct,Java,Spring,Dependency Injection,Postconstruct,我有一个问题,这就是问题的要点:(循环中涉及到更多的类,但可以这样表示) 很明显,我得到了一个空指针,因为BeanB还没有解析。我还使用了AfterPropertieSet,它是相同的。我的问题是,是否有一种方法可以在初始化整个上下文之后运行init()方法,这样我就不会得到这个空指针?我知道存在这种循环依赖是个麻烦,需要解决,但我正在重构一个巨大的项目以使用Spring DI并更改设计,逻辑和业务需要一个要求其他团队完成的漫长过程。我不明白为什么您首先需要使用serviceDispatcher
很明显,我得到了一个空指针,因为BeanB还没有解析。我还使用了AfterPropertieSet,它是相同的。我的问题是,是否有一种方法可以在初始化整个上下文之后运行init()方法,这样我就不会得到这个空指针?我知道存在这种循环依赖是个麻烦,需要解决,但我正在重构一个巨大的项目以使用Spring DI并更改设计,逻辑和业务需要一个要求其他团队完成的漫长过程。我不明白为什么您首先需要使用
serviceDispatcher
。您可以尝试直接将BeanB
注入BeanA
:
@Service
public class BeanA{
private BeanB beanB;
@Autowired
public BeanA(BeanB b){
beanB = b;
beanB.someMethod();
}
}
在spring上下文完全初始化后,您必须订阅事件才能执行代码
@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println(event.getApplicationContext());
}
}
@组件
类N51348516实现ApplicationListener{
@凌驾
ApplicationEvent(ContextRefreshedEvent事件)上的公共无效{
System.out.println(event.getApplicationContext());
}
}
但是我想你真正需要的是让你的bean通过注释变得懒惰,这样你就能够正确地访问它们。对于类
BeanA
,添加注释@DependsOn(“beanB”)
我认为你的例子不太好。我的意思是这里存在循环依赖,其中servicedipatcher
需要BeanA
作为依赖项,反过来BeanA
需要servicedipather
作为依赖项。我认为你应该重新考虑你的方法。@Aris,正如我在问题中所解释的,在我的工作环境中更改设计和逻辑非常耗时,因为项目太大,这应该由其他团队完成。所以我需要一种方法来解决这个问题,避免改变循环依赖关系。我不知道这是否有帮助,但尝试使用构造函数而不是字段注入,并使用@Lazy
注释。你可以在这里读到更多:我在问题中解释说我不能改变设计。BeanA和BeanB不能相互依赖,因为它们位于不同的业务子系统中。这正是我所需要的。谢谢Bohdan Levchenko
@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println(event.getApplicationContext());
}
}