Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在初始化所有spring上下文之后,有没有一种方法可以调用bean中的方法_Java_Spring_Dependency Injection_Postconstruct - Fatal编程技术网

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());
    }
}