以下代码在Spring 4中工作正常,但我想知道为什么getBean(FooService.class)返回已经加载的bean。我认为bean加载的顺序不能得到保证,这意味着可以获得一个null bean。是因为加载目标是一个类而不是一个String(即。对象),还是因为FooService bean有一个特殊的范围,比如原型?如果是这样,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);
}
答案 0 :(得分:1)
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实例中的哪一个)请求),而按名称搜索允许您获取特定的命名bean实例。
答案 1 :(得分:0)
首先,String是一个完整的权限类,就像你自己创建的任何类一样。
您在fooService中获取内容的原因是ApplicationContext getBean method能够根据您传递给它的参数检索托管bean。
如果无法检索bean,您可能会遇到以下一些例外情况:
抛出:NoSuchBeanDefinitionException - 如果没有给定类型的bean 被发现NoUniqueBeanDefinitionException - 如果有多个bean的话 找到给定的类型BeansException - 如果bean不能 创建