spring-core-9-92 | Spring Bean Class加载阶段:BD对应的Class是怎样加载的?

WhatsApp网页版扫码分析 扫码登录本质上是WhatsApp的多设备登录,设备之间可以独立运行,那么当我们首次通过WhatsApp扫码登录二维码时,到底发生了那些事情?交换了那些数据? 阅读详情

Spring Bean Class 加载阶段

上一节分析了关于 BeanDefinition 合并的细节过程, 那么接下来在 Spring Bean 被创建之前, 需要将Bean对应的class进行加载. 那么这里就要涉及到一些细节需要理清.

ClassLoader 类加载

第一个涉及到 java 里面的一些基础, ClassLoader , 这个东西其实接触框架的同学会更加熟悉, java的类加载主要是依靠 ClassLoader 来进行的.

可以参考:
java ClassLoader详解

Java Security 安全控制

第二个是关于java security,就是Java安全里面的一些控制,在spring早期是没有增加这块的实现的,后期开始增加了一些相关的控制,多提一点,过去是spring在实现的时候,在 IoC 的实现DI和我们说依赖注入和依赖查找的时候,他没有注重关于Java Security的一个安全整合,不过在这方面 Java EE 规范里面有清晰的描述,所以后续在当前版本看的时候,会发现里面有一些 Java Security API 的代码,后面会讲到这些代码的作用.

ConfigurableBeanFactory 临时ClassLoader

第三个方面,这个方面是个大的方面,这个方面本节其实选择性的跳过,后面会带入一个简单的场景和大家分析一下,这个场景实际上是非常有限的,通常我们是用不到的。

代码示例

java.lang.ClassLoader
org.springframework.beans.factory.config.BeanDefinition
org.springframework.beans.factory.support.AbstractBeanFactory
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory
org.springframework.util.ClassUtils
java.lang.Class

org.geekbang.thinking.in.spring.bean.lifecycle.MergedBeanDefinitionDemo

从问题开始, BeanDefinition 是怎么 从文本的元信息形式加载到 Class 的?

好,我们还是回到idea里面来,前面章节知道了 BeanDefinition 在合并之后会生成 RootBeanDefinition。那么接下来有很重要的一个操作,就是我们前面看到过 BeanDefinition 实际上里面有一个很重要的信息,这个是我们的bean的一个基本的来源,也就是说它会 getBeanClassName 。

org.springframework.beans.factory.config.BeanDefinition#getBeanClassName

	/**
	 * Return the current bean class name of this bean definition.
	 * <p>Note that this does not have to be the actual class name used at runtime, in
	 * case of a child definition overriding/inheriting the class name from its parent.
	 * Also, this may just be the class that a factory method is called on, or it may
	 * even be empty in case of a factory bean reference that a method is called on.
	 * Hence, do <i>not</i> consider this to be the definitive bean type at runtime but
	 * rather only use it for parsing purposes at the individual bean definition level.
	 * @see #getParentName()
	 * @see #getFactoryBeanName()
	 * @see #getFactoryMethodName()
	 */
	@Nullable
	String getBeanClassName();

前面我们也分析过,其实 BeanDefinition 它是一个关于Bean的元信息的配置或者是描述,那么事实上它是通过文本的方式来进行呈现的,它这里并没有显式的告诉你它的类是什么,我们知道Java里面类的描述是通过Class来进行表达,那么Class又是由 ClassLoader 来进行加载的,因此这个BeanDefinition 实例化这一过程和我们的传统的Java的作用机制肯定是跑不掉的。

java.lang.ClassLoader

/**
 * A class loader is an object that is responsible for loading classes. The
 * class <tt>ClassLoader</tt> is an abstract class.  Given the <a
 * href="#name">binary name</a> of a class, a class loader should attempt to
 * locate or generate data that constitutes a definition for the class.  A
 * typical strategy is to transform the name into a file name and then read a
 * "class file" of that name from a file system.
 *
 */
public abstract class ClassLoader {

事实上在 Spring IoC容器的实现里面,ClassLoader 加载是一个边缘化的操作(其实是封装的太深了…),通常我们不太重视,接下来我们会通过一个方法的方式来进行操作。

首先我们看回之前的示例 MergedBeanDefinitionDemo,然后在依赖查找的位置打上断点:

org.geekbang.thinking.in.spring.bean.lifecycle.MergedBeanDefinitionDemo
org.geekbang.thinking.in.spring.bean.lifecycle.MergedBeanDefinitionDemo
org.springframework.beans.factory.support.AbstractBeanFactory#getMergedBeanDefinition(java.lang.String, org.springframework.beans.factory.config.BeanDefinition, org.springframework.beans.factory.config.BeanDefinition)
在这里插入图片描述

然后在上一节讲解的 getMergedBeanDefinition 中也打上断点.

接下来debugger, 直接走到第二个断点, 看一下调用栈:
在这里插入图片描述
org.springframework.beans.factory.support.AbstractBeanFactory#checkMergedBeanDefinition
在这里插入图片描述

点到 doGetBean 方法中, 然后打上断点并运行到该位置, 这样我们就跳过了上节的内容, 关注我们本节的内容, 加载BeanDefinition对应的Class是怎样的.

在这里插入图片描述

看这个地方关于 User 的 RootBeanDefinition 已经组装好了,但是执行到这个阶段的时候,我们只知道了Bean的元信息,还没有告诉你它具体的一个Bean 创始的过程。

往后还要跳过一些细节,这里的 dependsOn 数组为空, 所以直接跳一个if判断过去

在这里插入图片描述

加载Class的流程, 是嵌套在spring实例化Bean的流程中的

好,这里注意注释, Create bean instance. 关注点来了. 首先 mbd.isSingleton() 当前没有指定 User 的 scope,所以这里bean 默认是 singleton, 往下走

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
在这里插入图片描述

这里getSingleton方法的传参使用了一个lambda表达式的方式, 尤其是第二个参数, 其实另有玄机, 那么我们先在 getSingleton 内部打个断点:

org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
在这里插入图片描述
这里可以看到 singletonObjects, 这个ConcurrentHashMap 之前有讨论过

spring-core-7-75 | 单例对象作为依赖来源:单体对象与普通Spring Bean存在哪些差异?

SingletonBeanRegistry#registerSingleton 会对其进行处理, 里面保存的单例对象, 我们前面知道这种注册到Spring容器中的单例对象是没有生命周期管理的, 相当于是一个外部对象. 同时因为这里对其有多次get和set的操作, 因此需要加一个锁保证多线程的安全.

那么很显然, 我们的User是来源于 BeanDefinition, 所以 singletonObjects里面是不会保存的, if (singletonObject == null) 判断就进去了, 而不是获取到Bean直接返回, 往下运行也能够发现这一点:

在这里插入图片描述

中间跳过一部分不太重要的代码, 运行到
singletonObject = singletonFactory.getObject();

在这里插入图片描述
这里的 singletonObject 是getSingleton方法的第二个入参, 之前我们注意到那里是一个lambda表达式, 因此在里面打上断点:

在这里插入图片描述

createBean(beanName, mbd, args)
其实是调用了子类实现:

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
在这里插入图片描述

那么断点打进去, 这里面就开始创建Bean示例的流程了.

在这里插入图片描述

AbstractBeanFactory#resolveBeanClass 加载BeanClass的关键方法

首先 RootBeanDefinition 已经得到了,得到之后往下看,这里就会有 resolveBeanClass 方法的调用, 看注释说明

// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.

确保bean的class已经在该点被确实的解析, 并且克隆 bean definition, 
以防在动态解析class时, 
因为merged beanDefinition 是共享的因而不能被存储

所以这个方法涉及class从 beanDefinition 的解析, 是很重要的, 转进去看

org.springframework.beans.factory.support.AbstractBeanFactory#resolveBeanClass
在这里插入图片描述
那么resolveBeanClass 会传两个参数进去,resolveBeanClass(mbd, beanName) 一个是 RootBeanDefinition,另一个是beanName,这个方法实际上有三个实参, 最后一个是可变长的, 没有传.

往下看,首先
if (mbd.hasBeanClass()) ,这个操作其实是告诉你当前 RootBeanDefinition 是不是存在这个bean的class的一个定义,就是如果之前Class解析好了就会直接返回了.

org.springframework.beans.factory.support.AbstractBeanDefinition#hasBeanClass
在这里插入图片描述

但是请注意, 这里判断 this.beanClass instanceof Class, 而我们可以看一下当前 beanDefinition 中的定义

在这里插入图片描述

是个字符串,尽管它内容不为空,hasBeanClass 则判断的是其是否为一个 Class,除非之前有调用过:

org.springframework.beans.factory.support.AbstractBeanDefinition#setBeanClass
在这里插入图片描述

否则 beanClass 仍然是一个字符串的形式, 根本不是一个完整的 Class 对象, 那么这个判断是判false的.

这里会得到一个重要的表现, beanClass 在 BeanDefinition 对应的CLass加载完之前是一个String, 而加载后会变为一个Class类型, 后面会与这里呼应.

在这里插入图片描述

往下走, System.getSecurityManager() , 可见返回 null, 涉及到我们前面讲的 JavaSecurity, java的安全框架, 这了返回null 说明系统的 安全管理器没有被激活.

当然无论是进if判断的哪一个分支, 能够看到都会调用 doResolveBeanClass 方法, 只不过前面那个套了一层 AccessController.doPrivileged(), 会有一个权限的控制, 那么这个权限控制是什么原理呢, 可以去 ClassLoader中了解一下:

拐个弯, 去看一下java的安全控制问题

java.lang.ClassLoader#loadClass(java.lang.String)
在这里插入图片描述
java.lang.ClassLoader#loadClass(java.lang.String, boolean)

通常来说在ClassLoader去load一个类的时候,会调用一个 loadClass() 方法,不过很少人会注意它, 这个方法里面其实暗藏玄机,这个方法里面其实并不是所有的class都是允许被加载的,它其实是有安全的一个限制的.

loadClass就要涉及到 ClassLoader 的选择, 再去看另一个方法,

java.lang.ClassLoader#getSystemClassLoader
在这里插入图片描述

看到注释, 这个里面其实有一个 SecurityException,注释说这里会有 checkPermission,会去检查权限,权限如果允许的话,才可以去获取 SystemClassLoader,也就是说ClassLoader的获取基本上需要安全的一个许可,只是通常我们的Permission全部都是允许的,就是grant的一个相应的权限,它一般都是 all , 相当于说所有的权限,比如文件读取权限, classLoader权限, 反射的权限都是允许的。

那么同样的方式,另外看一下,在 Thread 里面,

java.lang.Thread#getContextClassLoader
在这里插入图片描述

Thread里面有一个 getContextClassLoader 方法,它这里也会有个安全的限制,你会看到最后一个方法也会去检查 SecurityManager已经激活的情况下,check他是不是有权限,因此这是需要安全的一个开关来进行控制的.

当然通常情况这个SecurityManager就等于空,因此可以直接去获取ContextClassLoader,但是其实并不代表它就是一定没有这个疑虑。所以这就是我们说BeanDefinition在读取ClassLoader的时候它的一个控制。

回到主题, AbstractBeanFactory#resolveBeanClass

image.png

接下来看到处理的方法就是 doResolveBeanClass 方法,这个方法就是从 BeanDefinition里面去得到我们的相关的类,两个参数就不说了, 进去看。

org.springframework.beans.factory.support.AbstractBeanFactory#doResolveBeanClass

image.png

打断点下来,这里就会存在一个细节,就是说这里会有 两个Classloader,一个是我们的当前BeanFactory的,另外一个是 dynamicLoader。前面我们提到了在 ConfigurableBeanFactory 临时ClassLoader,那么这个就在这边体现了.

image.png

往下走代码,第一个 beanClassLoader,就是当前的 AppClassLoader, 而第二个dynamicLoader 其实也是它, 这些都是jvm提供给我们的spring 容器的.

另外提到一个细节,就是说有时候我们去得到这个 beanClassLoader,我们需要用到一个 BeanClassLoaderAware,后面会讲到它,

package org.springframework.beans.factory;

/** 
 * Callback that allows a bean to be aware of the bean
 * {@link ClassLoader class loader}; that is, the class loader used by the
 * present bean factory to load bean classes.
 *
 * <p>This is mainly intended to be implemented by framework classes which
 * have to pick up application classes by name despite themselves potentially
 * being loaded from a shared class loader.
 *
 * <p>For a list of all bean lifecycle methods, see the
 * {@link BeanFactory BeanFactory javadocs}.
 *
 * @author Juergen Hoeller
 * @author Chris Beams
 * @since 2.0
 * @see BeanNameAware
 * @see BeanFactoryAware
 * @see InitializingBean
 */
public interface BeanClassLoaderAware extends Aware {

   /**
    * Callback that supplies the bean {@link ClassLoader class loader} to
    * a bean instance.
    * <p>Invoked <i>after</i> the population of normal bean properties but
    * <i>before</i> an initialization callback such as
    * {@link InitializingBean InitializingBean's}
    * {@link InitializingBean#afterPropertiesSet()}
    * method or a custom init-method.
    * @param classLoader the owning class loader
    */
   void setBeanClassLoader(ClassLoader classLoader);

}

这个接口会把 ClassLoader 传进来,这个 ClassLoader 就是BeanFactory的那里获取的 ClassLoader.

那么有这个接口也就印证了一个问题, Spring的ClassLoader 是可以替换的.

image.png

回到 doResolveBeanClass 内, 再往下面看,前面知道 typesToMatch 其实为空,所以这个if判断都不会进.

image.png

那么再往下面看,

mbd.getBeanClassName();

image.png

那么这个 BeanClassName Spring容器中有可能会不一致, 看后面的处理

Object evaluated = evaluateBeanDefinitionString(className, mbd);

org.springframework.beans.factory.support.AbstractBeanFactory#evaluateBeanDefinitionString

@Nullable
protected Object evaluateBeanDefinitionString(@Nullable String value, @Nullable BeanDefinition beanDefinition) {
   if (this.beanExpressionResolver == null) {
      return value;
   }

   Scope scope = null;
   if (beanDefinition != null) {
      String scopeName = beanDefinition.getScope();
      if (scopeName != null) {
         scope = getRegisteredScope(scopeName);
      }
   }
   return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));
}

往下走, 这里面就会去做一个操作。BeanClassName名称存在,并且不等于空的时候,这里会去评估一下,里面的代码挺长, 但其实和我们的主流程关系不大, 就是把当前的 BeanClassName 给返回出来,请注意一下,有时候BeanClassName和 evaluated 可能是不一致的. 这里不说了,我们当前的例子没有这样的情况.

image.png

往下走, freshResolve 也是 false,所以又跳过了一部分

image.png

直接看

mbd.resolveBeanClass(beanClassLoader);

又回到了 BeanDefinition里面了?! 那前面这么复杂是在做啥子么!

AbstractBeanDefinition#resolveBeanClass, 折腾了这么久, 先进的 AbstractBeanFactory#resolveBeanClass ,又回到了BeanDefinition

org.springframework.beans.factory.support.AbstractBeanDefinition#resolveBeanClass
image.png

image.png

进去看看,第一行获取 className,

Class<?> resolvedClass = ClassUtils.forName(className, classLoader);

接下来就是 ClassUtils.forName(className, classLoader); ClassUtils 就是由spring提供的一个获取Class类的工具类, 那么其中获取Class的关键就是去调用 Class.forName(), 里面其实还是使用了java传统的ClassLoader来进行ClassLoading.

org.springframework.util.ClassUtils#forName
image.png

java.lang.Class#forName(java.lang.String, boolean, java.lang.ClassLoader)
image.png

调用完之后这里User对应的BeanDefinition内部发生了一个很重要的变化

image.png

注意这里 beanClass过去是什么,过去是String,获取到Class之后, 它这里做了一个交换,把过去的数据类型变成一个Class类型,至此我们需要的BeanDefinition所对应的Class才真正获取完.

一个简单的步骤:

AbstractBeanFactory#resolveBeanClass中将string类型的beanClass 通过当前线程Thread.currentThread().getContextClassLoader(),Class.forName来获取class对象,将beanClass变为Class类型对象.

总结

刚才通过简单的示例调试出, BeanDefinition,在ClassLoading中最终还是运用到传统的 Java ClassLoader,只不过在调用过程中,它会涉及到一些Java安全的细节操作,实际上这个操作在Java本身就已经具备了,而是我们通常没有把它激活因而会忽略调。

那么接下来会进入到一个重要环节,就是当BeanDefinition从配置解析以及合并再到Class加载之后,那么要如何进行实例化.

PyCharm旧版本下载地址 快捷找到PyCharm历史版本下载地址 阅读详情

相关推荐

为Codex添加任务完成提示音:提升开发效率的实用技巧

在自动化脚本开发和模型训练过程中,实时获取任务状态反馈是提升工作效率的关键。通过Hook机制,开发者可以在代码执行的关键节点注入自定义逻辑,实现各种自动化操作。Codex的Hook系统特别适合用于任务完成提醒,其post_execution节点能准确捕获执行结束事件。技术实现上,只需简单配置TOML文件并编写音频播放脚本,就能让系统在任务完成时自动播放提示音。这种声音反馈机制尤其适用于长时间运行的批量任务和模型训练场景,实测可提升30%以上的工作效率。结合动态音效选择和跨平台兼容方案,该技巧还能扩展为桌面通

weixin_26767391的博客 538

loadClass()和forName()的区别

类加载的方式 主要有两种: 隐式加载:使用 new + 构造方法时,隐式的调用类加载器,加载对应的类到 JVM 中,是最常见的类加载方式。 显式加载:使用 loadClass()、forName() 等方法显式的加载需要的类,对于显式加载这种类加载方式来讲,当我们获取到了 Class 对象后,需要调用 Class 对象的 newInstance() 方法来生成对象的实例。 两种类加载方式的区别...

To be a great coder 7998

解决Unity与3DMax模型单位与中心点偏差的完整指南

本文详细解析了Unity与3DMax模型导入时常见的单位与中心点偏差问题,提供了从3DMax单位设置、FBX导出到Unity接收调整的完整解决方案。通过实战案例和高效工作流建议,帮助开发者实现unity与3dmax的单位统一,避免尺寸错误和轴心偏移,提升3D资源导入效率。

weixin_29015899的博客 286

Spring的Bean类?

Spring Bean是事物处理组件类和实体类(POJO)对象的总称,Spring Bean被Spring IOC容器初始化,装配和管理。在Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期以及作用域等信息。 Bean类的配置项 Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。 1、class:该配置项是强制项,用于指定创

深海微澜 495

Ubuntu安装opencv4.5(自己安装过程详细)

1.下载opencv 在opencv官网下载source版,下载链接 http://opencv.org/releases.html。别下载错版本 下载过程就不多说了。 2.安装过程 2.1解压 unzip opencv-4.5.0.zip cd opencv-4.5.0 2.2安装依赖的库 sudo apt-get install cmake sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-

weixin_45629790的博客 1万+

【亲测可用!】阿里达摩院开源实时数字人对话VideoChat本地部署教程(8G显存可跑)

本文主要记录在部署阿里达摩院开源实时数字人对话VideoChat时遇到的问题,希望对各位技术开发或爱好者有所帮助!

波点兔的博客 3894

JavaBean与Java的Class的关系

java中bean是什么呢?javabean又是什么呢? bean跟javabean是一样的概念,知识不同场合的不同叫法。 bean、javabean本质上是一个由java文件生成的类,按照sun的说法,一个组件即java应用程序或applet的重复使用的部件就是bean 我觉得可以简单的把它理解为:符合一定规范的java类,所以你就可以像理解...

weixin_30954607的博客 336

什么是数据挖掘?数据挖掘到底在解决什么问题?

本文我将借助5W1H的思想来带你从整体上了解一下数据挖掘。比如什么是数据挖掘为什么要做数据挖掘在哪些场景下用数据挖掘怎么做数据挖掘第一个问题,什么是数据挖掘?这个问题看似很简单,但似乎也很难有一个明确的答案。如果非要给数据挖掘一个定义的话,那么我认为数据挖掘就是寻找数据中隐含的知识,并用于产生商业价值。也就是说它是我们在数据中,尤其是在大量的数据中找到一些有价值,甚至是非常有价值的东西的一种手段。

m0_64336780的博客 1万+

Spring为什么要专门定义BeanDefinition ,有Class不行吗?

借助 IDE ,打开的接口定义,从方法列表上看,Bean 的类信息 - 全限定类名 ( beanClassName )Bean 的属性 - 作用域 ( scope ) 、是否默认 Bean ( primary ) 、描述信息 ( description ) 等Bean 的行为特征 - 是否延迟加载 ( lazy ) 、是否自动注入 ( autowireCandidate ) 、初始化 / 销毁方法 ( initMethod / destroyMethod ) 等。

Apple_Boy的博客 498

前拉后推计划逻辑适用于哪些行业和企业规模?

《前拉后推计划逻辑的行业适用性分析》摘要:前拉后推计划逻辑(需求端后推锚定交付、供应端前拉匹配资源)最适用于需求波动大且具规模效益的行业,包括家具制造(定制化需求+批量运输)、机械装备(非标设备+部件采购)、消费电子(短周期产品+核心部件备货)及汽车配套(交期绑定+批量生产)等领域。该模式要求企业具备:1)独立计划部门;2)ERP/MES等信息系统;3)资源冗余能力,故更适配中型(1-10亿营收)和大型企业(10亿+)。小型企业需简化应用,仅聚焦关键环节。不适配需求稳定(如快消品)、无规模效益或短周期生产的

追随内心 144

【第1章>第9节】基于FPGA的图像开运算处理算法的Verilog实现

本文介绍了基于FPGA的开运算图像处理实现方法。主要内容包括:1)输入图像二值化处理,通过阈值将灰度图像转换为二值图像;2)数据缓存与窗口提取,使用寄存器数组缓存5行图像数据并构建5×5处理窗口;3)腐蚀运算逻辑,判断窗口内是否全为白色像素;4)膨胀运算逻辑,检测窗口内是否存在白色像素。最后给出了Verilog实现方案,通过级联腐蚀和膨胀模块完成开运算处理。该方法可用于FPGA图像处理算法开发。

MATLAB,verilog,python,opencv,tensorflow,caffe,C,C++ 315

Spring入门案例--bean基础配置

其中,bean标签的功能、使用方式以及id和class属性的作用,我们通过一张图来描述下。bean对象只有一个就避免了对象的频繁创建与销毁,达到了bean对象的复用,性能高。获取到结论后,问题就来了,那如果我想创建出来非单例的bean对象,该如何实现呢?环境准备好后,接下来就可以在这个环境的基础上来学习下bean的别名配置,如果对象是无状态对象,即该对象没有成员变量没有进行数据存储的,如果对象是有状态对象,即该对象有成员变量可以用来存储数据的,bean依赖注入的ref属性指定bean,必须在容器中存在。

薛定谔的猫 963

阿波罗开发板硬件架构与STM32模块化设计详解

嵌入式开发板的模块化设计是提升硬件复用性、降低迭代成本的关键技术路径。其核心在于底板与核心板的电气解耦与功能分层,依托STM32系列MCU(如F429/F767)的丰富外设资源与引脚复用能力,实现信号完整性、电源域隔离与热管理的系统级协同。该架构显著支撑工业HMI、智能家居网关、便携医疗设备等典型场景,尤其在RGB LCD驱动、QSPI Flash内存映射、多协议通信(CAN/RS485/USB)及低功耗唤醒(WK_UP按键)等工程实践中展现出高可靠性与易调试性。本文围绕阿波罗开发板展开深度解析,覆盖最小系

weixin_42510201的博客 64

看看spring源码一 Spring class 加载过程(源码阅读分析)

http://geeekr.com/read-spring-source-1-how-to-load-bean/  地址链接 源码分析 org.springframework.web.context.ContextLoaderListener初始化IOC容器的。   public class ContextLoaderListener extends ContextLoader im...

lw18781108072的博客 687

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

spring类加载方式解析

重要的是要理解,尽管容器的操作(如获取Bean)是通过方法调用来实现的,并且这些方法调用本身不会修改方法的内部逻辑或行为,但Spring IoC容器的设计确保了其操作是线程安全的。实现了ApplicationContext接口,所有的应用上下文如ClassPathXmlApplicationContext、FileSystemXmlApplicationContext和AnnotationConfigApplicationContext都是从AbstractApplicationContext继承而来。

sutingStart的博客 1644

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Spring 配置中 bean 的 class 使用工厂 Bean 的含义解析

Spring 配置中 bean 的 class 使用工厂 Bean 的含义解析

太阳火神的美丽人生 5363

spring bean元素的内置属性和子元素

一、bean的内置属性   id属性:id为bean的唯一标识名,就是常说的beanName。它必须是合法的XMLID,在整个XML文档中唯一。 name属性:用来为bean id创建一个或多个别名(这里是别名不是beanName),它可以是任意的字母符合,多个别名之间用逗号或空格分开。如果没有定义bean的id,那么第一个别名就会被作为id;如果也没有定义name,那么自动生成一个id和一个...

江城宴的博客 1887

Spring基础(一)

Spring的容器机制 容器是Spring框架实现功能的基础,Spring容器类似一家超级工厂,当Spring启动时,所有被配置过的类都会被纳入Spring容器的管理之中。 Spring把它管理的类称为Bean,Spring可以通过XML文件或注解获取配置信息,进而通过容器对象来管理Bean。Spring对Bean的管理体现在它负责创建Bean并管理Bean的生命周期。Bean运行在Spring容器中,它只需发挥自己功能,而无须过多关注Spring容器的情况。 BeanFactory接口 BeanFact

Despacito1006的博客 563

Spring学习笔记一

1.什么是Spring Spring是一款目前主流的 Java EE 轻量级开源框架,它是以IOC(控制反转)和AOP(面向切面编程)为内核。 2.Spring框架的优点 1.方便解耦,简化开发 2.支持AOP 3.方便程序的测试 4.方便集成各种优秀框架 3.Spring的体系结构 4.入门的第一个程序(基于Maven,IDEA版) 1.创建Module->Maven->选择“Create from archetype”->找到如图选项并创建好项目 2.在po..

我的博客 1125

spring容器bean加载过程解析

入口:AbstractBeanFactory的getBean方法: public Object getBean(String name) throws BeansException { return doGetBean(name, null, null, false); } doGetBean方法会返回指定bean的实例 protected Object getSingleton...

sdlyjzh的专栏 2083

Spring -- Spring配置文件详解(Bean标签的基本配置(id,class)/ 范围配置 / 不同范围时的对象的创建时期 / Bean生命周期配置(生命周期方法) )

1. Spring配置文件详解 1.1 Bean标签的基本配置 示例: <!-- id 可以随意取 但必须唯一; class对于Spring IOC 要管理的类--> <bean id="userDao" class="com.tian.dao.impl.UserDaoImpl"/> 1.2 Bean标签范围配置 示例: <!-- 多例的--> <bean id="userDao" class="com.t

天行健 君子以自强不息,地势坤 君子以厚德载物。 1787

Caused by: java.lang.ClassNotFoundException:

分析:Caused by: java.lang.ClassNotFoundException: com.mchange.v2.c3p0.ComboPooledDataSource.class得知找不到类,看spring-config.xml,看class发现错误,改为正确的即可。配置还是要细心一点。org.springframework.beans.factory.CannotLoadBeanCl...

qq_42318281的博客 1784

Spring加载配置类

Spring加载配置类入口AbstractApplicationContextPostProcessorRegistrationDelegateConfigurationClassPostProcessorConfigurationClassParserComponentScanAnnotationParserClassPathBeanDefinitionScannerClassPathScanningCandidateComponentProviderConditionEvaluatorAnnotatio

qq_44737446的博客 1622

Spring动态加载/刷新class文件,注入Bean到Spring容器

Spring动态加载/刷新class文件,并注入Bean到Spring容器

Wax_Gourd258的博客 2472

【Spring】Bean加载方式

registerBeanDefinitions方法的第一个参数和我们在上一种加载方式中使用过的annotationMetadata的作用是一样的,因此在这里我就不再过多介绍了,我们重点看第二个参数。第二个参数的类型是BeanDefinitionRegistry,光看名字我们知道了这是一个关于BeanDefinition的注册表,那么什么是BeanDefinition呢?这个其实涉及到spring比较底层的东西了,BeanDefinition实际上记录的是关于一个Bean的一系列信息,它包括但不限于:

qq_50675319的博客 2286

Java类加载机制 .class文件加载 .class文件实例化对象 Spring自动包扫描Bean原理

呵呵,大家用过spring有些年头的朋友可能知道,原来我们在项目开发的过程中需要在spring的配置文件applicationContext.xml中手动配置我们的实体bean,然后还需要手动配置对象间的依赖关系。然而现在,开发过程中只需要在applicationContext.xml文件中加入: 这样spring就会自动去搜索包里面的实体,当然还需要我们给需要被扫描的实体增加annotat

bling 2899

手写Spring——bean的扫描、加载和实例化

手动造轮子,实现ioc的基本功能

专注写bug 2102
上一篇: Redis-02-1 Centos7安装Redis
下一篇: spring-core-9-93 | Spring Bean实例化前阶段:Bean的实例化能否被绕开?
sunforraining
博客等级 码龄9年 13粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值