在上一篇,我们看到这样的代码:
DefaultListableBeanFactory beanFactory = createBeanFactory();
.... synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; }
知道Application将getBean方法的实现委托给了DefaultListableBeanFactory,在DefaultListableBeanFactory按F4键我们可以看到这样的继承结构:

其中XmlBeanFactory我们经常用到,从上图看知道咋回事了吧?我们来看看DefaultListableBeanFactory的getBean方法吧:
public Object getBean(String name) throws BeansException {
return doGetBean(name, null, null, false);
}
doGetBean方法位于AbstractBeanFactory之中,它调用了createBean子方法:
protected abstract Object createBean(String beanName, RootBeanDefinition mbd, Object[] args)
throws BeanCreationException;
又是一个抽象方法,看来doGetBean又是一个模板设计模式的具体体现,Spring里面很多很多这样的用法,有时候会转晕,但是没有办法,他们就是这样设计的,至于为什么这么设计,以后再说明!createBean方法被实现在了AbstractAutowireCapableBeanFactory类中:
public <T> T createBean(Class<T> beanClass) throws BeansException {
// Use prototype bean definition, to avoid registering bean as dependent bean.
RootBeanDefinition bd = new RootBeanDefinition(beanClass);
bd.setScope(SCOPE_PROTOTYPE);
return (T) createBean(beanClass.getName(), bd, null);
}
看到了吧,这里把当前要求的Bean对应的BeanDefinition初始化出来了,作为创建Bean的基础。
protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args)
throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
// Make sure bean class is actually resolved at this point.
//也就是看看能不能实例化!
resolveBeanClass(mbd, beanName);
// Prepare method overrides.
try {
mbd.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbd.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
//如果配置了psotprocessor就返回proxy,动态代理会在取得bean之后的操作后
//去处理psotprocessor
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
Object bean = resolveBeforeInstantiation(beanName, mbd);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbd.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
Object beanInstance = doCreateBean(beanName, mbd, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
那么doCreateBean应该就是了,请快些看下篇
分享到:
相关推荐
《Spring框架核心源代码分析及感悟》 Spring框架作为Java企业级应用开发的基石,其强大的功能和灵活性深受开发者喜爱。深入理解Spring的核心源代码,不仅有助于我们更好地使用这个框架,还能提升我们的编程技艺和对...
Spring框架是Java开发中不可或缺的一部分,它以依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)为核心,提供了丰富的功能来简化企业级应用的开发。当我们深入理解...
pring源代码各个模块作用 核心模块: 1 spring-core:核心模块 依赖注入IOC和DI的最基本实现 spring-beans:Bean工厂与装配 spring-context:上下文,即IOC容器 spring-context-support:对IOC的扩展,以及IOC子容器 ...
Spring框架是Java开发中...总的来说,这份"spring框架学习源代码"涵盖了Spring框架的关键知识点,包括IOC、DI、AOP、bean管理以及与数据库和日志的集成。通过学习和实践,你可以深化对Spring的理解,提高Java开发能力。
通过阅读并分析这些源代码,开发者可以更深入地理解Spring框架的工作机制,学习如何有效地使用其特性来提高代码的可维护性和可扩展性。每个章节都会提供实际的示例,帮助开发者将理论知识转化为实践技能。对于想要...
Spring IOC(Inversion of Control,控制反转)是Spring框架的核心特性,它负责管理对象的生命周期和依赖关系。在这个示例源代码中,我们可以看到多个Java类和一个bean.xml配置文件,这些都是实现Spring IOC的关键...
Spring源代码解析(一):IOC容器 Spring源代码解析(二):IoC容器在Web容器中的启动 Spring源代码解析(三):Spring JDBC Spring源代码解析(四):Spring MVC Spring源代码解析(五):Spring AOP获取Proxy Spring源...
Spring框架的IOC(Inversion of Control,控制反转)容器是其核心组件,它负责管理和装配应用中的对象。在Spring源代码解析的第一部分,我们将聚焦于IOC容器,特别是BeanFactory接口,它是所有Spring容器的基础。 ...
虽然AOP不在本次讨论的"Spring--IOC"主题内,但它是Spring框架的另一个重要特性,它允许我们在不修改已有代码的情况下,添加横切关注点,如日志、事务管理等。 **MyEclipse5.5开发平台** MyEclipse5.5是一款基于...
Spring框架是Java开发中不可或缺的一部分,尤其在企业级应用中,其Inversion of Control(IoC)容器是其核心特性之一。IoC,也被称为依赖注入(Dependency Injection,DI),是一种设计模式,它将对象的创建和管理权...
"spring-demo10-注解-IOC.zip"这个压缩包文件很显然包含了关于Spring框架如何使用注解进行依赖注入的示例代码。接下来,我们将深入探讨Spring中的注解和依赖注入。 依赖注入(DI)是一种设计模式,它允许我们解耦...
对于熟悉Spring框架的开发者来说,学习BlueSky-IOC会相对容易,因为它遵循了类似的依赖注入模式,但同时也有其独特的设计和实现。通过深入了解和实践,开发者不仅可以提升个人技能,还能为团队带来更高效、更灵活的...
通过分析这个"Spring-IOC丐版"的实现,开发者可以更好地理解Spring是如何工作的,这对于深入学习Spring框架、优化自己的代码或者构建类似的轻量级容器都是非常有帮助的。同时,这也是一个很好的实践案例,可以帮助...
Spring 1.2源代码是Java开发者深入了解Spring框架工作原理的重要资源。这个版本的Spring框架在2004年发布,标志着Spring框架发展的早期阶段,它包含了许多核心特性,为现代企业级Java应用奠定了基础。在这个源代码...
Spring源代码解析2:IoC容器在Web容器中的启动.doc Spring源代码解析3:Spring JDBC .doc Spring源代码解析4:Spring MVC .doc Spring源代码解析5:Spring AOP获取Proxy .doc Spring源代码解析6:Spring声明式事务...
Spring框架是Java开发中最常用的轻量级开源框架之一,它以IoC(Inversion of Control,控制反转)和AOP(Aspect Oriented Programming,面向切面编程)为核心,极大地简化了企业级应用的开发工作。在本文中,我们将...
在本文中,我们将深入探讨Spring框架的核心特性——控制反转(Inversion of Control,简称IoC)和依赖注入(Dependency Injection,简称DI),以及如何通过注解配置和Maven项目构建来实现这一概念。Spring框架是Java...
在本篇中,我们将深入探讨Spring框架的核心组件——IoC(Inversion of Control)容器,这是Spring 2.5.6版本的一部分。IoC容器是Spring框架的心脏,它负责管理对象的生命周期和依赖关系,使得开发者能够实现松耦合和...
Spring框架的核心特性之一是Inversion of Control(IoC),也被称为依赖注入(Dependency Injection)。IoC是一种设计模式,它将对象之间的依赖关系从代码中解耦出来,转交给一个外部容器(在Spring中就是...