为什么这个bean不是null

时间:2016-11-17 13:12:03

标签: java spring

以下代码在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);
    }

2 个答案:

答案 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不能   创建