gpt4 book ai didi

java - 为什么这个 bean 不为空

转载 作者:行者123 更新时间:2023-11-30 10:36:15 27 4
gpt4 key购买 nike

以下代码在 spring 4 中运行良好,但我想知道为什么 getBean(FooService.class) 返回一个已经加载的 bean。我以为bean加载的顺序是不保证的,也就是说有可能得到一个null bean。是因为加载目标是一个类而不是字符串(即对象)还是因为 FooService bean 有一个特殊的范围,比如原型(prototype)?如果有,getBean(class) 和 getBean(object) 有什么区别

public abstract class AbstractService implements ApplicationContextAware {
protected ApplicationContext applicationContext;

protected FooService fooService;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

@PostConstruct
protected void postConstruct() {
fooService = applicationContext.getBean(FooServiceImpl.class);
}

最佳答案

ApplicationContext::getBean 方法创建指定类型的 bean(如果尚未创建)。

对于下面两个bean类:

@Component
public class Bean1 {

@Autowired
private ApplicationContext applicationContext;

public Bean1() {
System.out.println("Bean 1 constructor");
}

@PostConstruct
public void init() {
System.out.println("Bean 1 @PostConstruct started");
applicationContext.getBean(Bean2.class);
System.out.println("Bean 1 @PostConstruct completed");
}
}

@Component
public class Bean2 {

@Autowired
private ApplicationContext applicationContext;

public Bean2() {
System.out.println("Bean 2 constructor");
}

@PostConstruct
public void init() {
System.out.println("Bean 2 @PostConstruct started");
applicationContext.getBean(Bean1.class);
System.out.println("Bean 2 @PostConstruct completed");
}
}

上下文初始化期间的打印输出是:

Bean 1 constructor
Bean 1 @PostConstruct started
Bean 2 constructor
Bean 2 @PostConstruct started
Bean 2 @PostConstruct completed
Bean 1 @PostConstruct completed

至于不同的getBean方法,如果你传入一个类,那么应用上下文中必须只存在该类的一个bean(否则Spring不会不知道您要求的那个类),而按名称搜索可以让您获得特定的命名 bean 实例。

关于java - 为什么这个 bean 不为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40655850/

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