在初始化所有 spring 上下文之后,有没有办法在 bean 中调用方法
Is there a way to call a method in a bean after all spring context is initialized
我有一个问题,这是它的要点:(循环中涉及更多 类 但可以这样表示)
@service
public class serviceDispatcher{
@Autowired
private BeanA a;
@Autowired
private BeanB b;
public BeanA getBeanA(){
return a;
}
public BeanB getBeanB(){
return b;
}
}
@Service
public class BeanA{
@Autowired
ServiceDispatcher sd;
@PostConstruct
private void init(){
sd.getBeanB().method;
}
}
显然我得到了一个空指针,因为 BeanB b 尚未解析。我也使用了 afterPropertiesSet,它是一样的。我的问题是,如果有一种方法可以在整个上下文初始化后 运行 init() 方法,这样我就不会得到这个空指针?我知道这种循环依赖很麻烦,需要解决,但我只是重构一个巨大的项目以使用 Spring DI 并更改设计、逻辑和业务需要一个漫长的过程来询问它由其他团队完成。
我不明白你为什么首先要使用 serviceDispatcher
。您可以尝试直接将 BeanB
注入 BeanA
:
@Service
public class BeanA{
private BeanB beanB;
@Autowired
public BeanA(BeanB b){
beanB = b;
beanB.someMethod();
}
}
您必须订阅 ContextRefreshedEvent 事件才能在 spring 上下文完全初始化后执行您的代码。
@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println(event.getApplicationContext());
}
}
但我想您真正需要的是使用 @Lazy 批注让您的 bean 变得惰性,以便您能够正确访问它们。
对于classBeanA
,添加注解@DependsOn("beanB")
我有一个问题,这是它的要点:(循环中涉及更多 类 但可以这样表示)
@service
public class serviceDispatcher{
@Autowired
private BeanA a;
@Autowired
private BeanB b;
public BeanA getBeanA(){
return a;
}
public BeanB getBeanB(){
return b;
}
}
@Service
public class BeanA{
@Autowired
ServiceDispatcher sd;
@PostConstruct
private void init(){
sd.getBeanB().method;
}
}
显然我得到了一个空指针,因为 BeanB b 尚未解析。我也使用了 afterPropertiesSet,它是一样的。我的问题是,如果有一种方法可以在整个上下文初始化后 运行 init() 方法,这样我就不会得到这个空指针?我知道这种循环依赖很麻烦,需要解决,但我只是重构一个巨大的项目以使用 Spring DI 并更改设计、逻辑和业务需要一个漫长的过程来询问它由其他团队完成。
我不明白你为什么首先要使用 serviceDispatcher
。您可以尝试直接将 BeanB
注入 BeanA
:
@Service
public class BeanA{
private BeanB beanB;
@Autowired
public BeanA(BeanB b){
beanB = b;
beanB.someMethod();
}
}
您必须订阅 ContextRefreshedEvent 事件才能在 spring 上下文完全初始化后执行您的代码。
@Component
class N51348516 implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println(event.getApplicationContext());
}
}
但我想您真正需要的是使用 @Lazy 批注让您的 bean 变得惰性,以便您能够正确访问它们。
对于classBeanA
,添加注解@DependsOn("beanB")