以下代码就是spring容器的核心初始化流程,包括ApplicationContext的实现都是使用的这样的代码实现容器的启动和初始化的
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions(new ClassPathResource("spring-beans.xml"));
logger.info("Pre-creating all beans");
beanFactory.preInstantiateSingletons();
logger.info("Complete pre-creating all beans");
reader.loadBeanDefinitions(new ClassPathResource("spring-beans.xml"));
这句代码会解析XML中定义的各种bean成为BeanDefinition然后注册到BeanFactory中,构造reader的时候我们传递了beanFactory作为reader的参数,这个时候就是使用beanFactory作为注册中心,所以loadBeanDefinitions就会解析之后注册beanFactory中。
beanFactory.preInstantiateSingletons();
这个方法是从org.springframework.beans.factory.config.ConfigurableListableBeanFactory
继承过来的,作用很明显,就是预初始化所有单例的bean,当然这里包括惰性初始化的bean,也就是指定了(lazy-init)为true的bean,理解这一点也就是明白了spring的applicationContext初始化的核心代码。当然ApplicationContext还有很多其他的内容。
网友评论