以XmlBeanFactory为例,最简单的取bean方式是:
BeanFactory factory = new XmlBeanFactory(new FileSystemResource("D:\\workspace\\JavaApplication2\\src\\javaapplication2\\spring\\beans.xml")); Car obj = (Car)factory.getBean("car");
Bean的配置文件内容也很简单:
<bean id="vehicle" abstract="true"> <property name="wheel" value="Four wheeler"/> </bean> <bean id="car" class="javaapplication2.spring.Car" parent="vehicle"> <property name="dicky" value="Flat dicky"/> </bean>
先看起始点,载入先走AbstractBeanFactory
public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); }
doGetBean方法中:
// Create bean instance. if (mbd.isSingleton()) { //传入一个内联类ObjectFactory并实现了getObject方法。 sharedInstance = getSingleton(beanName, new ObjectFactory() { public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); //有异常则销毁bean throw ex; } } }); bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd); //此处开始实例化bean
}
通过new ObjectFactory()的回调方法,回调当前类继承的createBean方法,该方法在父类AbstractAutowireCapableBeanFactory中:
AbstractAutowireCapableBeanFactory->
protected Object createBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) throws BeanCreationException { // Make sure bean class is actually resolved at this point. resolveBeanClass(mbd, beanName); //载入该bean的class,并放置到mbd里面,bean的生成不在这里。 // Prepare method overrides. try { mbd.prepareMethodOverrides(); } catch (BeanDefinitionValidationException ex) { throw new BeanDefinitionStoreException(mbd.getResourceDescription(), beanName, "Validation of method overrides failed", ex); } try { // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance. Object bean = resolveBeforeInstantiation(beanName, mbd); //尝试获取一个proxy,普通bean这里一般是空的返回 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); //开始create bean的实例,mbd中包括了需要的class if (logger.isDebugEnabled()) { logger.debug("Finished creating instance of bean '" + beanName + "'"); } return beanInstance; }
进入AbstractBeanFactory中的protected Class resolveBeanClass方法:
try { if (mbd.hasBeanClass()) { return mbd.getBeanClass(); } if (System.getSecurityManager() != null) { return AccessController.doPrivileged(new PrivilegedExceptionAction<Class>() { public Class run() throws Exception { return doResolveBeanClass(mbd, typesToMatch); } }, getAccessControlContext()); } else { return doResolveBeanClass(mbd, typesToMatch); <---还要继续进去看生成方法。 } }
转入doResolveBeanClass:
private Class doResolveBeanClass(RootBeanDefinition mbd, Class... typesToMatch) throws ClassNotFoundException { if (!ObjectUtils.isEmpty(typesToMatch)) { ClassLoader tempClassLoader = getTempClassLoader(); if (tempClassLoader != null) { if (tempClassLoader instanceof DecoratingClassLoader) { DecoratingClassLoader dcl = (DecoratingClassLoader) tempClassLoader; for (Class<?> typeToMatch : typesToMatch) { dcl.excludeClass(typeToMatch.getName()) } } String className = mbd.getBeanClassName(); return (className != null ? ClassUtils.forName(className, tempClassLoader) : null); //通过自己的ClassUtils的forName方法来实例化class } } return mbd.resolveBeanClass(getBeanClassLoader()); <----这里传入了bean的classloader,下面继续看这里 }
AbstractBeanDefinition->resolveBeanClass
public Class resolveBeanClass(ClassLoader classLoader) throws ClassNotFoundException { String className = getBeanClassName(); if (className == null) { return null; } Class resolvedClass = ClassUtils.forName(className, classLoader);//classloader传入后,仍然是用forName方法加载class this.beanClass = resolvedClass; return resolvedClass; }
再来看forName做了些什么
ClassUtils ->
ClassLoader classLoaderToUse = classLoader; if (classLoaderToUse == null) { classLoaderToUse = getDefaultClassLoader(); } try { return classLoaderToUse.loadClass(name); //也比较简单,直接调用loadClass方法加载 }
最终将class load进来。
Bean实例化过程:
AbstractAutowireCapableBeanFactory->createBeanInstance
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args) // Need to determine the constructor... //提取构造函数,如果没有就是空 Constructor[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); if (ctors != null ||mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { return autowireConstructor(beanName, mbd, ctors, args); } // No special handling: simply use no-arg constructor. return instantiateBean(beanName, mbd); //这里实例化
进入
AbstractAutowireCapableBeanFactory->instantiateBean
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) ...这里省略没用的 else { beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);//下面看这里的实例化 } BeanWrapper bw = new BeanWrapperImpl(beanInstance); //返回一个包装类对象 initBeanWrapper(bw); return bw;
SimpleInstantiationStrategy->instantiate
public Object instantiate(RootBeanDefinition beanDefinition, String beanName, BeanFactory owner) synchronized (beanDefinition.constructorArgumentLock) { constructorToUse = (Constructor<?>) beanDefinition.resolvedConstructorOrFactoryMethod; ... } return BeanUtils.instantiateClass(constructorToUse); //BeanUtils来初始化实例 ,给出了实例化需要的构造函数
再来看BeanUtils的实例化方法,比较简单,直接用反射的构造函数来newInstance。
BeanUtils->
public static <T> T instantiateClass(Constructor<T> ctor, Object... args) throws BeanInstantiationException { try { ReflectionUtils.makeAccessible(ctor); return ctor.newInstance(args); }
AbstractAutowireCapableBeanFactory->
Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) // Initialize the bean instance. Object exposedObject = bean; try { populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) { exposedObject = initializeBean(beanName, exposedObject, mbd); } } return exposedObject; //返回给AbstractBeanFactory
相关推荐
4. **启动后处理器(BeanPostProcessor)**:这些是特殊类型的Bean,它们在所有常规Bean实例化之后,但初始化之前进行处理。它们的实例化顺序由`@Order`注解决定,或者通过实现`Ordered`接口来控制。 5. **...
在预实例化过程中,`getBean(beanName)`被调用,这是`AbstractBeanFactory`类中的一个方法,用于从Bean工厂中获取指定名称的Bean实例。 6. **实际获取Bean**: 进入`doGetBean()`方法,这是Bean实例化的关键步骤...
Spring Bean 实例化实现过程解析 Spring Bean 实例化是 Spring 框架中一个非常重要的概念,它直接关系到 Bean 的生命周期和管理。在 Spring 框架中,Bean 的实例化是通过容器来管理的,容器会根据配置文件中的信息...
本篇文章将深入探讨Spring项目中Bean的实例化过程,包括三种主要的bean实例化方式:构造方法、静态工厂和实例工厂。 首先,让我们了解什么是Bean。在Spring中,Bean是应用程序中的业务对象,它们由Spring容器负责...
同时,对源码进行调试也是一个有效的排查手段,可以追踪到Bean实例化的具体位置,找出问题的根源。 综上所述,Spring Bean重复执行两次的问题通常是由于配置错误、依赖注入循环、初始化回调的不当使用、静态工厂...
而工厂方法是其中一种自定义实例化过程的方法。 1. **实例工厂方法** 实例工厂方法是通过一个具体的工厂类实例来创建Spring Bean。在Spring配置文件中,我们需要定义一个工厂bean,然后指定该工厂bean的`factory-...
SpringApplication 会从 META-INF/spring.factories 文件中获取监听器,并通过 createSpringFactoriesInstances() 方法实例化成对象返回。 2. 获取命令行参数 SpringApplication 会获取命令行参数,如 --server....
本文将详细探讨Spring中bean实例化的三种主要方式:普通构造方法创建、静态工厂创建和实例工厂创建。 1. 普通构造方法创建: 这是最常见、最直观的方式,适用于大部分情况。在Spring配置文件中,我们通过`<bean>`...
### Spring 实例化Bean的三种方式详解 在Java企业级应用开发中,Spring框架因其强大的功能和灵活性,成为了处理依赖注入、事务管理等任务的首选工具。其中,Bean的实例化是Spring框架的核心功能之一,它支持多种...
在 Bean 对象实例化过程中,BeanDefinitionRegistryPostProcessor 接口扮演着重要的角色,该接口的调用分为三步:1、调用实现了 PriorityOrdered 排序接口;2、调用实现了 Ordered 排序接口;3、没有实现接口的调用...
- **XML配置**:在传统的Spring应用中,Bean的定义通常写在XML配置文件中,如`springbean-xml`中的配置。 - **注解配置**:使用`@Component`,`@Service`,`@Repository`和`@Controller`注解标记类,配合`@...
本文主要研究 Spring 框架中 Bean 的实例化过程,包括 Bean 的生命周期和循环依赖问题的解决方案。在 Spring 框架中,Bean 的实例化是通过 BeanFactory 中的 getBean 方法来实现的,该方法根据 bean 的名字、Class ...
Spring允许自定义BeanPostProcessor,它们在Bean实例化后执行特定的处理,比如AOP代理。这些后处理器将在Bean实例化后,初始化前介入。 7. **Bean初始化**: 实例化完成后,Spring会执行Bean的初始化方法,包括...
此外,Spring提供了一种名为BeanPostProcessor的接口,它允许我们自定义Bean实例化和初始化过程中的逻辑。通过实现`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法,可以在Bean初始化...
在Spring框架中,静态实例化是指在应用程序启动时,即Spring容器初始化过程中创建Bean实例的过程。通常情况下,Spring会根据配置文件中的定义,在应用启动时自动创建和管理Bean实例。这种方式可以确保在应用运行期间...
Spring实例化bean过程解析及完整代码示例 在Spring框架中,bean的实例化是一个非常重要的过程。今天我们将详细介绍Spring实例化bean的过程,并提供一个完整的代码示例,以便更好地理解这个过程。 第一步:调用Bean...
- 使用类构造器实例化:这是最简单的实例化方式,Spring将调用无参构造器创建Bean的实例。 - 使用静态工厂方法实例化:这种方式通过调用一个静态方法来获取Bean实例,适用于简单工厂模式。 - 使用实例工厂方法...
3. 加载 bean:Spring 会加载 bean,并将其实例化。 4. 获取 bean:应用程序可以从容器中获取 bean 并使用它。 在加载 bean 的过程中,Spring 会使用 Resource 对象来表示 XML 文件,然后使用 ...
整个Spring Bean的生命周期流程是:如果有Bean实现了InstantiationAwareBeanPostProcessor接口,则会在Bean实例化前后被调用。Spring容器首先对Bean进行实例化,默认情况下Bean是单例的。实例化完成后,如果有Bean...
这是Spring创建Bean实例的基础。 - **id属性**:是Bean在BeanFactory中的唯一标识符,用于通过BeanFactory获取Bean实例。例如,`<bean id="myBean" class="com.example.MyClass">`。 - **name属性**:类似于`id`...