spring加载bean的过程

POWER(十一)charge pump原理 电荷泵是一种基于电容充放电原理的DC-DC转换电路,通过开关控制实现电压转换,包括升压、降压和负压输出。其核心是利用电荷守恒原理,通过电容存储和转移电荷来改变输出电压。典型拓扑结构包括倍压电路和多阶升压电路,具有结构简单、体积小等优势。关键参数包括转换效率、输出电流能力和开关频率,适用于芯片供电、显示屏驱动等低功耗场景。LVDS部分补充说明了自举电路在驱动电路中的应用及其自同步特性。 阅读详情

 

首先,我在这里举个demo,大致演示一下怎么获取配置文件中的bean:

一个applicationContext.xml配置文件,这个不可少;
一个bean,这里我没用接口,直接用一个普通的类做为Spring的bean;
一个Junit测试类;

applicationContext.xml中的代码如下:

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

  3. <beans>

  4. <bean id="myBean" class="com.hushenjian.MyBean"></bean>

  5. </beans>

MyBean类中的代码如下:

  1. public class MyBean{

  2. public void getName(String name) {

  3. System.out.println("我的名字是:" + name);

  4. }

  5. }

单元测试类的代码如下:

  1. public class MyTest {

  2.  
  3. public static void main(String[] args) {

  4. ClassPathResource res = new ClassPathResource("applicationContext.xml");

  5.  
  6. XmlBeanFactory bf = new XmlBeanFactory(res);

  7.  
  8. MyBean bean = (MyBean)beanFactory.getBean("myBean");

  9.  
  10. bean.getName("hushenjian");

  11. }

  12. }

运行单元测试,打印出“我的名字是:hushenjian”,测试类只有四行代码,但Spring到底为我们做了些什么?下面我们就基于这样的场景去分析bean的加载过程。

分析:

(1) 获取配置文件

ClassPathResource res = new ClassPathResource("applicationContext.xml");

这一句只是读入配置文件,并封装成Spring提供的Resource对象,供后面逻辑使用。
    在Spring内部,有超过十个以Resource结尾的类或文件,他们处理不同类型的资源文件,如FileSystemResource、ClassPathResource、UrlResource等,处理过程大同小异。
(2) 解析配置文件并注册bean

XmlBeanFactory bf = new XmlBeanFactory(res);

这里面的逻辑相当复杂,涉及到众多Factory、Reader、Loader、BeanDefinition、Perser、Registry系列接口和类,但他们做的基本事情就是将applicationContext.xml配置的Bean信息构成BeanDefinition对象,然后放到Factory的map中(这一步就是所谓的注册),这样以后程序就可以直接从Factory中拿Bean信息了。
    要跟踪这个处理过程,大致流程如下:
    a. 构造XmlBeanFactory时,会调用Reader对象的loadBeanDefinitions方法去加载bean定义信息
    b. 在Reader对象的doLoadBeanDefinitions验证文档(配置文件)模式,然后通过documentLoader对象处理资源对象,生成我们Document对象;
    c. 调用BeanDefinitionDocumentReader对象的doRegisterBeanDefinitions去注册bean定义信息;
    d. parseBeanDefinitions从xml文档根节点递归循环处理各个节点,对bean节点真正的处理工作委托给了BeanDefinitionParserDelegate,方法parseBeanDefinitionElement将一个bean节点转换成一个BeanDefinitionHolder对象,这才是最终的解析过程;
    e. DefaultListableBeanFactory.registerBeanDefinition利用解析好的beanDefinition对象完成最终的注册,其实就是把beanName和beanDefinition作为键值对放到beanFactory对象的map;
(3) 实例化Bean

MyBean bean = (MyBean)bf.getBean("myBean");

    这一步Spring同样做了复杂的处理,但基本原理就是利用反射机制,通过bean的class属性创建一个bean的实例,例子中是创建了一个StudentBean对象。

(4) 调用对象的方法,没什么好说的。当然如果方法上做了事务、AOP之类的声明,这一步的处理就不会那么简单了。

下面来分析一下bean的解析和注册过程:

bean的解析和注册过程就是下面这句代码执行的:

XmlBeanFactory bf = new XmlBeanFactory(res);

其具体代码为:

  1. public class XmlBeanFactory extends DefaultListableBeanFactory {

  2. //这里为容器定义了一个默认使用的bean定义读取器

  3. private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);

  4. public XmlBeanFactory(Resource resource) throws BeansException {

  5. this(resource, null);

  6. }

  7. //在初始化函数中使用读取器来对资源进行读取,得到bean定义信息。

  8. public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {

  9. super(parentBeanFactory);

  10. this.reader.loadBeanDefinitions(resource);

  11. }

跟进去之后发现实际调用了XmlBeanDefinitionReader对象的loadBeanDefinitions方法。

  1. public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {

  2. //封装资源文件

  3. return loadBeanDefinitions(new EncodedResource(resource));

  4. }

  5. InputStream inputStream = encodedResource.getResource().getInputStream();

  6. try {

  7. InputSource inputSource = new InputSource(inputStream);

  8. if (encodedResource.getEncoding() != null) {

  9. inputSource.setEncoding(encodedResource.getEncoding());

  10. }

  11. return doLoadBeanDefinitions(inputSource, encodedResource.getResource());

  12. }

这个方法是整个资源加载的切入点,我们先大致看看这个方法的处理流程:

a. 封装资源文件
    new EncodedResource(resource)
b. 获取输入流
    从EncodedResource对象中获取InputStream并构造InputSource对象
c. 然后调用doLoadBeanDefinitions方法完成具体的加载过程

3.2 doLoadBeanDefinitions方法

  1. int validationMode = getValidationModeForResource(resource);

  2. Document doc = this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware());

  3. return registerBeanDefinitions(doc, resource);

这个方法的代码很长,如果不考虑异常处理,其实只做了三件事情:

a. 获取对XML文件的验证模式
b. 加载XML文件,并得到对应的Document对象
c. 根据返回的Document对象注册bean信息

这里对验证模式不进行讨论;
这里不对Document对象的加载过程进行讨论;
这里直接进入bean的注册方法registerBeanDefinitions
3.3 registerBeanDefinitions方法

  1. public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {

  2. // 这里定义解析器,使用XmlBeanDefinitionParser来解析xml方式的bean定义文件 - 现在的版本不用这个解析器了,使用的是XmlBeanDefinitionReader

  3. if (this.parserClass != null) {

  4. XmlBeanDefinitionParser parser =

  5. (XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass);

  6. return parser.registerBeanDefinitions(this, doc, resource);

  7. }

  8. // 具体的注册过程,首先得到XmlBeanDefinitionReader,来处理xml的bean定义文件

  9. BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();

  10. int countBefore = getBeanFactory().getBeanDefinitionCount();

  11. documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

  12. return getBeanFactory().getBeanDefinitionCount() - countBefore;

  13. }

当把文档转换为Document对象后,提取及注册bean就是我们的重头戏了。
这里并没有看到我们想要的代码,而是把工作委托给了BeanDefinitionDocumentReader对象去处理
3.4 BeanDefinitionDocumentReader.doRegisterBeanDefinitions方法

  1. public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {

  2. this.readerContext = readerContext;

  3. Element root = doc.getDocumentElement();

  4.  
  5. BeanDefinitionParserDelegate delegate = createHelper(readerContext, root);

  6. preProcessXml(root);

  7. parseBeanDefinitions(root, delegate);

  8. postProcessXml(root);

  9. }

  10. protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {

  11. if (delegate.isDefaultNamespace(root.getNamespaceURI())) {

  12. //这里得到xml文件的子节点,比如各个bean节点

  13. NodeList nl = root.getChildNodes();

  14. //这里对每个节点进行分析处理

  15. for (int i = 0; i < nl.getLength(); i++) {

  16. Node node = nl.item(i);

  17. if (node instanceof Element) {

  18. Element ele = (Element) node;

  19. String namespaceUri = ele.getNamespaceURI();

  20. if (delegate.isDefaultNamespace(namespaceUri)) {

  21. //这里是解析过程的调用,对缺省的元素进行分析比如bean元素

  22. parseDefaultElement(ele, delegate);

  23. }else {

  24. delegate.parseCustomElement(ele);

  25. }

  26. }

  27. }

  28. } else {

  29. delegate.parseCustomElement(root);

  30. }

  31. }

终于走到了核心逻辑的底部doRegisterBeanDefinitions,如果说以前一直是XML加载解析的准备阶段,
那么这个方法算是真正地开始进行解析了。

这个方法的代码我们比较熟悉,读取Document对象,循环每一个bean节点,然后进行处理。
Spring有两类Bean,一个是默认的,一个是自定义的bean,这个方法对他们分别调用了不同方法进行处理。

3.5 对默认标签的处理 processBeanDefinition方法


 
  1. protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {

  2. BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);

  3. if (bdHolder != null) {

  4. bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);

  5. BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

  6. getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));

  7. }

  8. }

a. 首先利用委托类的parseBeanDefinitionElement方法进行元素解析,返回BeanDefinitionHolder对象bdHolder,经过这个方法,bdHolder实例已经包含我们配置文件中对bean的所有配置信息了,如name、class等。
b. 对bdHolder进行装饰
c. 解析完成后,要对bdHolder进行注册,同样,注册过程委托给了BeanDefinitionReaderUtils去处理

3.6 delegate.parseBeanDefinitionElement(ele)
这个方法便是对默认标签解析的全过程了,他将一个element节点转换成BeanDefinitionsHolder对象,其中ele和bdHolder中的属性是对应的。

a. 提取元素的id和name属性
b. 进一步解析其他所有属性并统一封装到BeanDefinition类型的实例
c. 将获取到的信息封装到BeanDefinitionHolder实例中。


 
  1. String id = ele.getAttribute(ID_ATTRIBUTE);

  2. String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);

  3.  
  4. AbstractBeanDefinition bd = createBeanDefinition(className, parent);

  5.  
  6. parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);

  7. bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));

  8.  
  9. parseMetaElements(ele, bd);

  10. parseLookupOverrideSubElements(ele, bd.getMethodOverrides());

  11. parseReplacedMethodSubElements(ele, bd.getMethodOverrides());

  12. parseConstructorArgElements(ele, bd);

  13. parsePropertyElements(ele, bd);

  14. parseQualifierElements(ele, bd);

  15.  
  16. return new BeanDefinitionHolder(bd, beanName, aliasesArray);

剩下的工作便是注册解析的BeanDefinition。

3.7 BeanDefinitionReaderUtils.registerBeanDefinition

这个方法并没有做太多事情,而是直接调用了BeanDefinitionRegistry的注册方法。BeanDefinitionRegistry是一个接口,有多个实现类,这里我们使用了默认的实现DefaultListableBeanFactory。

3.8 DefaultListableBeanFactory.registerBeanDefinition

代码啰嗦了一大堆,实际上所谓的注册,就是把beanName和beanDefinition对象作为键值对放到BeanFactory对象的beanDefinitionMap。
但Spring经常把简单的逻辑写的非常“啰嗦”,仔细分析代码,发现他完成了几个事情:
a. 对bean对象的校验
b. 检查beanFactory中是否已经有同名的bean,如果有,进行相应处理
c. 把bean对象放到beanDefinitionMap中(这就是最终所谓的注册)
d. 清除整个过程缓存的对象数据


以上便是Spring对bean解析注册的全过程,总结一下大致步骤:
1. 加载XML文件,封装成Resource对象
2. 调用Reader对象方法读取XML文件内容,并将相关属性放到BeanDefinition实例
3. 将BeanDefinition对象放到BeanFactory对象。

 

AF自动对焦 CDAF PDAF 前言 主流的AF: CDAF, PDAF, laser assist AF(这个只是辅助,在微距或者拍摄纹理不明显的场景下好用)。 1.cdaf原理 CDAF的大致原理就是检测图像锐度或者等价于锐度的参数,不断推动马达寻找最清晰点实现合焦或者对焦。如下图: 缺点:对焦准确,速度慢,由于camera帧率,cpu处理速度,马达反映时间问题不能实时对焦运动物体。 2.pdaf原理 计算相位差,将相位差转换为相位差和af code的关系.... 阅读详情

相关推荐

ITK-snap医学图像标注方法(超级详细)——保姆级

医学3D图像标注方法,非常详细,保姆级

jialiyk的博客 3万+

Spring之Bean创建过程

Spring提供了xml、注解、JavaConfig多种方式来配置bean,不论何种方式,Spring最终都会将bean封装成BeanDefinition对象,Spring创建bean的依据也是通过BeanDefinition来完成的。当我们调用getBean()方法获取bean实例时,不管是单例bean还是原型bean,首次调用时容器内都不存在可用的bean实例,这时就不得不去创建bean了,我们分析下Spring创建bean的过程。

程序员小潘 3802

AI虚拟人物 数字人直播,不用出镜,不用露脸的直播方式(附教程 软件)

我们先来看一组数据,这是我通过蝉妈妈查到的某位虚拟主播的一个带货数据,粉丝还不到 3000 人,每次直播 1 到 4 个小时,30天的总销量达到了1200单,15天,总销售额 2 万,可能相对来说客单价还是比较低,最关键的是才直播了 6 场,如果说他能够一个月直播 20 天,每天花 4个小时去直播,当个副业来做,就可以达到最起码月入 3 万的一个收入水平,我个人觉得是非常的不错的。大家把商品图片放在背景,只要场景设置的不错,场景和产品的关联度高,直播的时候挂上购买链接也会有一定的成交。

. 7万+

Spring的Bean创建过程

spring将内部管理的诸多对象称为一个个bean,而这些bean的创建流程大致分为两个大阶段: 下面本人将从上述两个阶段来阐述bean的完整创建过程。 在对象进行创建之前,spring容器需要了解所创建的对象的信息,才能在后续阶段根据了解的信息创建bean对象。这些信息即是实际工作中我们为对象所写的配置信息,它们一般以xml文件、properties文件和注解的形式存在于我们的项目之中。 一个以xml文件为存储形式的bean配置文件如下: 因此,

Yuan_Su_的博客 2951

【第六届起重机创意大赛国一作品——资料分享】

文章目录前言一、比赛内容分析二、确定方案与作品模型1.方案简图2.作品模型三、电控部分控制思路单片机选择与资源分配拓展板的设计接线与走线代码分享总结

qq_19308801的博客 7784

用VASP计算GW+BSE

VASP在5.3以后的版本都能用解BSE方程的方法,在计算光吸收的过程中考虑激子效应。 下面就来写一个用BSE计算bulkSi的例子 首先,介电函数的计算是在GW计算的基础之上的。这里首先介绍G0W0的计算(我们这里直接在PBE的波函数基础上进行G0W0计算)。 1.PBE自恰计算,写WAVECAR System= Silicon groundstate occupied

ultra1989的专栏 2万+

spring创建bean的过程

Spring创建bean的过程包括以下步骤: 定义bean:通过在Spring配置文件中定义bean,包括bean的类型、属性、构造函数等。 装配bean:通过将bean的属性注入到bean中,以完成bean的装配。 初始化bean:在bean被创建后,调用相应的初始化方法,对bean进行初始化。 预处理bean:在bean被创建之前,对bean进行预处理,以满足bean的需求。 将be...

weixin_42584586的博客 730

三相电路小白必看:正弦量向量表示法保姆级教程(附欧拉公式推导)

本文为电气工程初学者详细解析了三相电路中正弦量的向量表示法,即相量法。通过几何直观和欧拉公式推导,阐明如何将时变正弦量转化为静态复平面向量进行运算,并利用平行四边形法则简化同频正弦量的加减计算。文章结合Python代码进行可视化验证,帮助读者牢固掌握这一分析交流电路的核心工具。

linux6sysadmin的博客 998

Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程

从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释

种一棵树最好的时间是十年前,其次是现在 3975

【学习笔记】人群归因分数 PAF 以及combined PAF(更新)

在此推荐2篇发表在lancet以及jama子刊上的paf文章,这两篇文章套路是一样的,只是在不同国家进行。希望对大家学习PAF有所帮助,后面有新内容也会继续分享,也欢迎大家分享使用R语言计算PAF的经验~~~的时候,先建立了相关矩阵,再做主成分分析,得到communality。详细信息大家可翻阅原文。

weixin_53499537的博客 1498

Python遥感图像处理应用篇(二十三):Python+GDAL 批量拼接图像

遥感影像拼接分多种不同的情况,比如比较常用的是两幅影像拼接或者多个图像合并为一个图像。GDAL中实现影像拼接的方式也有多种,比如常用可以通过numpy读取影像数组,并计算各个图像的numpy数组范围,合并多个numpy数组为一个最终的结果,并将其重新输出为一幅新的图像,即可实现图像的拼接。另外比较方便的一种方法便是使用GDAL.warp()函数方法。这个函数的功能很多,可以实现多种不同的目的,比如用于坐标系转换、投影变换、图像合并与镶嵌、地理范围裁剪、更改分辨率、矢量裁剪等多种功能。这些功能可以通过设置Op

soderayer的博客 4644

Spring Bean的加载机制

1.spring 注解的加载 在 Spring 容器的核心基类 AbstractApplicationContext refresh 中设置后置处理器时,AnnotatedBeanDefinitionReader 调用 AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)的方法,将注解的解析处理器注册到当前 Spring容器上下文中。正是通过这些注解解析器,实现了对注解的解析及Bean的注入等功能。 public An

weixin_50763382的博客 1095

Python 爬虫教程:金融数据定向抓取(银行 + 投资网站数据结构化提取)

在当今数字化时代,金融数据的获取和分析对于投资者、分析师以及金融机构来说至关重要。Python 爬虫技术可以帮助我们高效地从各种网站上抓取金融数据,从而为投资决策、风险评估和市场分析提供支持。本文将详细介绍如何使用 Python 爬虫技术来定向抓取银行和投资网站的数据,并将其结构化提取,以便进一步分析和使用。

u014481728的博客 884

Spring bean的加载过程

Spring bean加载、bean的生命周期

mantantan的博客 2648

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring中Bean的加载过程

为后续 Bean 实例化做准备。

m0_64630668的博客 763

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

spring核心之Bean加载过程剖析

此文是从spring框架的源码进行剖析Bean加载的一个过程 从springboot程序入口开始剖析

qq_42394044的博客 3233

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

spring源码阅读之bean加载过程(一)

而obtainFreshBeanFactory()方法里有下面一行,发现最终用的BeanFactory为DefaultListableBeanFactory,是不是有点眼熟了,没错,就是第一个测试用例中使用的,那后面的过程就是一致的了,下图中画出来的两句跟第一个测试用例的两句表达的是一个意思,obtainFreshBeanFactory()方法执行完之后在factory的beanDefinitionMap里已经存了xml里有的数据,即第一个类图里面的流程都run了一遍。

京东科技开发者 1089

深入理解 Spring 中的 Bean 加载过程

目录一、准备工作二、配置Bean三、读取配置文件四、Spring容器初始化4.1 获取beanFactory4.1.1 刷新BeanFactory4.1.2 加载BeanDefinitions4.1.3 注册BeanDefinitions4.1.4 解析BeanDefinitions4.2 BeanFactory预准备工作4.3 实例化并调用BeanFactoryPostProcessors4.3.1 完成beanFactory 的初始化,初始化所有剩余的单例 bean。4.3.2 实例化Bean4.3.

一颗奋起萌发的种子的博客 2090

Spring的bean加载的过程

一、源码跟踪 通过getBean(“instanceA”)做为入口分析bean的加载过程: debug模式F5进入,展示如下图 从此处做为入口进入,主要是寻找哪一行代码给我们返回的instanceA实例,很明显此处做了实例的返回,展示入下图 继续进入跟踪,展示如下图 调用重载的方法跟踪到最后 这里就涉及到spring容器的三级缓存,展示如下图: 这个singletonObjects.get(beanName)的singletonObjects就是我们经常提的容器,展示如下图: 这是个Conc

szq18545570866qq的博客 773

讲讲Spring框架Bean的加载过程

Spring框架Bean的加载过程

小道士写程序 440

spring bean加载过程

spring bean加载过程 Spring通过资源加载器加载相应的XML文件,使用读取器读取资源加载器中的文件到读取器中,在读取过程中,解析相应的xml文件元素,转化为spring定义的数据结BeanDefinition,把相应的BeanDefinition注册到注册表中。注册表中包含的BeanDefinition的数据结构,没有经过加工处理过,无法得到我们想要的bean对象。 我们如何得到Be...

weixin_40494342的博客 405

spring源码解析流程,一步一步在源码加注释带你了解bean的加载过程

spring 前述:spring源码环境搭建以及源码下载在文章后方有链接,可自行参考搭建,这里只是对加载过程做一个解析,spring全家桶远不止这些东东,感兴趣的小伙伴可以去官网看一下,本文将以源码加注释的方式进行过程解析,带你了解spring中bean到底是如何一步步加载完成 了解重点:bean的生命周期、加载过程 最终目的:学习spring源码短期内不对对你的技术有太大提升,可能只是了解到漂亮的代码是如何写出来,为何别人写代码就不是简单的接口加上无限的if-else,所以加强基础知识的学习、多去思考如何

F957614265的博客 3907

源码解析Spring中Bean加载的过程

源码解析Spring中Bean加载的过程1. 总体流程2. 代码3. 进入debug,跟踪流程1.创建上下文,设置配置文件路径2. 进入refresh方法3. 为上下文的刷新做准备工作,进入prepareRefresh()4.创建工厂并通过BeanDefinitionReader读取bean的信息(ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();)5. prepareBeanFactory(beanFactory)

weixin_43956000的博客 692

Spring IOC容器加载Bean的初始化过程

这是我的第一篇博客,正式开启小奋之旅。 主要记录了Spring 加载Bean的过程。主要参考了如下链接,谢谢。 Spring容器IOC初始化过程---今天终于进行总结了 https://juejin.im/post/5ab30714f265da237b21fbcc 谈一谈我对Spring Resource的理解 ...

zhyk1117的博客 1593

Spring 的 Bean 的加载过程

然后,再注册到一个ConcurrentHashMap中,在spring中具体的方法就是registerBeanDefinition(),这个Map存的key是对象的名字,比如Person这个对象,它的名字就是person,值是BeanDefination,它位于DefaultListableBeanFactory类下面的beanDefinitionMap类属性中,同时将所有的bean的名字放入到beanDefinitionNames这个list中,目的就是方便取beanName;

weixin_40650387的博客 458
上一篇: Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
下一篇: 聚集索引与非聚集索引的总结
It_BeeCoder
博客等级 码龄10年 967粉丝 238原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值