spring源码解读开篇-1.bean图纸加载

Java代码覆盖率测试实战:Jacoco原理、集成与高级应用指南 代码覆盖率测试是衡量软件测试完整性的关键技术指标,它通过分析测试执行过程中代码的覆盖情况,帮助开发者识别未测试的代码路径。其核心原理基于字节码插桩技术,在程序运行时动态注入探针来收集执行数据。这项技术的价值在于为代码质量提供客观度量,驱动编写更健壮的测试用例,有效降低线上缺陷风险。在Java生态中,Jacoco凭借其与Maven、Gradle等构建工具的无缝集成、低性能开销和丰富的报告能力,已成为覆盖率测试的事实标准。本文聚焦于Jacoco的实战应用,详细解析其On-the-fly插桩模式的工作原理,并提供 阅读详情

好多看源码的小伙伴,像是在玩一个没有主线指引的游戏,在诺大的地图上到处碰壁,时不时钻进死胡同,一次次消磨掉了耐心,失去了再玩下去的勇气;这次呢,我来做你的引导npc;

我来说说我的看法

其实坚持不下去,真的不怪你。
首先:spring已经发展很多年了,你不是从第一行代码看起。
其次:先有了设计思想,才有代码实现。而反过来从代码去找思想,就是反人类的做法
再者:代码量繁多,你不需要看完所有的代码。只需要看懂关键部分,看懂关键部分之后,其余的细枝末节需要用的时候再去看(借助文档等等工具),你会很轻松的看懂他们

好了下面我们开始正题

首先最宏观来看spring就是一个容器,容器里面可以装很多个bean,每个bean之间有着互相有关系,可以互相引用。这个容器被称为ioc容器;
在这里插入图片描述
从宏观上它做了以下的这些事情;
在这里插入图片描述

约定:咱们这里就以ClassPathXmlApplicationContext这个ioc容器的实现来进行讲解,其余的触类旁通;而且细节不做深入研究,点到即止。具体细节读者知道思想后再去看源码也不会困难
知识点扫盲:
什么是beanDefinition?
beanDefinition就是spring用来封装bean定义信息的一个模型。把原始的bean元数据读取出来解析后通过该模型进行管理,和使用。好处当然是统一了bean定义信息。站在核心容器的视角:隔离了多种bean定义方式的复杂解析逻辑(比如xml,注解,properties等等,你甚至可以自定义)。核心容器只管取统一的beanDefinition来使用即可;
今天就来看读取bean配置信息的内容:先上图
也就是下图中的1,2,3标号,如何从xml转换成beanDefinition的
在这里插入图片描述

1.第一个环节读取bean信息路标

classPathXmlApplicationContent是通过创建一个XmlBeanDefinitionReader的读取器来对xml进行读取翻译成BeanDefinition的。
这里面几个定义你需要了解:
1.ClassPathXmlApplicationContent: 就是一个容器的实现
2.XmlBeanDefinitionReader: 用来读取解析xml中的bean配置的类
3.BeanDefinition: 存储bean定义信息一个包装类,提供bean的配置信息

!!!那么关键就是去找到这个XmlBeanDefinitionReader在哪里创建和使用的;

跟着路标来找代码,没有标路标的部分可以暂时不看:

路标1:构造器
构造ioc容器

//构造ioc容器
	ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");

路标2:另一个构造器
调用另一个参数较多的构造器

 	public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
 	//调用另一个构造器来进行构造
		this(new String[] {configLocation}, true, null);
	}

路标3:refresh()
然后又通过找到refresh();刚启动肯定要强制刷新容器。买了新房子你还得装修呢不是?

	public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
			throws BeansException {
		//构造器的第一行先调用父级一个参数的构造函数
		super(parent);
		//把配置路径解析存到configLocations属性上
		setConfigLocations(configLocations);
		if (refresh) {
		//刷新容器这里是真正干活的地方;
			refresh();
		}
	}

路标4:obtainFreshBeanFactory
到这里方法开始变得复杂了,但是不要走错路,跟着路标走;这里面的东西你扫一眼就好了,主要看到obtainFreshBeanFactory()这个位置;这里面就是实例化一个具体容器,把配置加载出来的地方;(如果你懂装饰者模式的话可能会有些感触,不懂也没关系)

@Override
	public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			//准备进行容器刷新
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			//告诉具体的子类去刷新包含的bean factory,这里其实是用的包装者模式,包装者中包含一个引用,然后返回该beanFactory容器对象
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			// Prepare the bean factory for use in this context.
			//为容器做一些准备,设置一些它需要的东西和配置等等
			prepareBeanFactory(beanFactory);

			try {
				// Allows post-processing of the bean factory in context subclasses.
				//允许子类去实现一些后置处理逻辑
				postProcessBeanFactory(beanFactory);

				// Invoke factory processors registered as beans in the context.
				//执行容器中注册的BeanFactoryPostProcessor
				invokeBeanFactoryPostProcessors(beanFactory);

				// Register bean processors that intercept bean creation.
				//注册BeanPostProcessor,在创建bean的前后等执行
				registerBeanPostProcessors(beanFactory);

				// Initialize message source for this context.
				//国际化相关,感兴趣自行了解
				initMessageSource();

				// Initialize event multicaster for this context.
				//注册事件广播器
				initApplicationEventMulticaster();

				// Initialize other special beans in specific context subclasses.
				//子类重写这个方法,在容器刷新的时候可以自定义逻辑,默认什么都不做
				onRefresh();

				// Check for listener beans and register them.
				//检查监听器bean并且注册,监听的就是上面广播器发出的各种不同类型的消息
				registerListeners();

				// Instantiate all remaining (non-lazy-init) singletons.
				//初始化所有剩下的非懒加载的单例bean!!!!!
				finishBeanFactoryInitialization(beanFactory);

				// Last step: publish corresponding event.
				//最后一步:发布相应的事件,比如容器刷新完成事件
				finishRefresh();
			}

			catch (BeansException ex) {
				logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex);

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}
		}
	}

路标5:refreshBeanFactory()

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {		//刷新beanFactory
		refreshBeanFactory();
		ConfigurableListableBeanFactory beanFactory = getBeanFactory();
		if (logger.isDebugEnabled()) {
			logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
		}
		return beanFactory;
	}

路标6:loadBeanDefinitions()
是不是看见曙光了。这里就是加载我们配置的xml等等信息的地方

	protected final void refreshBeanFactory() throws BeansException {
		if (hasBeanFactory()) {
			destroyBeans();
			closeBeanFactory();
		}
		try {
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			beanFactory.setSerializationId(getId());
			customizeBeanFactory(beanFactory);
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}

路标7:找到对应的加载逻辑
类路径为

org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.support.DefaultListableBeanFactory)

我们可以看到ClassPathXmlApplicationContext就是这个类的子类;

这里主要逻辑就是构造一个bean定义信息读取器

	@Override
	protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
		// Create a new XmlBeanDefinitionReader for the given BeanFactory.
		//创建一个类型为XmlBeanDefinitionReader的解析器来读取xml的内容
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		// Configure the bean definition reader with this context's
		// resource loading environment.
		beanDefinitionReader.setEnvironment(this.getEnvironment());
		//容器本身就是一个资源加载器的实现
		beanDefinitionReader.setResourceLoader(this);
		//设置一个实体的处理器
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		// Allow a subclass to provide custom initialization of the reader,
		// then proceed with actually loading the bean definitions.
		//初始化redaer
		initBeanDefinitionReader(beanDefinitionReader);
		//进行读取
		loadBeanDefinitions(beanDefinitionReader);
	}

路标8:进到loadBeanDefinitions()

	protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
		//加载Redource类型的资源
		Resource[] configResources = getConfigResources();
		if (configResources != null) {
			reader.loadBeanDefinitions(configResources);
		}
		//加载字符串路径类型的资源最终还是会转换成Resource类型
		String[] configLocations = getConfigLocations();
		if (configLocations != null) {
			reader.loadBeanDefinitions(configLocations);
		}
	}

到这里点到即止,再往下如何解析xml等等部分的内容,最终解析出beanDefinitionr然后通过org.springframework.beans.factory.support.BeanDefinitionRegistry#registerBeanDefinition方法把bean定义信息注册到BeanDefinitionRegistry中,
因为ClassPathXmlApplicationContext 本身就是一个BeanDefinitionRegistry的子类DefaultListableBeanFactory的一个装饰的装饰者,所以也可以说就是把定义信息注册到它自己中;
如何解析这部分内容不做深入,有兴趣自己看一下。

下面做一个总结:

第一步做的事情:
ClassPathXmlApplicationContext 通过创建XmlBeanDefinitionReader 去把xml中bean定义信息转换成BeanDefinition加载到它自己中;为后续创建bean准备好了图纸

ClassPathXmlApplicationContext 在这个过程中拥有两个能力:
1.是一个ResourceLoader,资源加载器,能读取xml资源
2.是一个BeanDefinitionRegistry,是一个注册管理器,能管理bean定义信息
为什么说它拥有这两个能力呢,
第一个其实是因为ClassPathXmlApplicationContext 是ResourceLoader的简介子类
第二个呢,线索在refreshBeanFactory();其实是一个装饰者模式的体现,ClassPathXmlApplicationContext 其实是DefaultListableBeanFactory实现的一个装饰;而DefaultListableBeanFactory又是一个BeanDefinitionRegistry的实现,所以ClassPathXmlApplicationContext 可以使用BeanDefinitionRegistry管理器的逻辑;
你可以自己试试从源码中找到这段代码来验证:

	protected DefaultListableBeanFactory createBeanFactory() {
		return new DefaultListableBeanFactory(getInternalParentBeanFactory());
	}

好了第一阶段bean信息加载到此结束了。bean的图纸画好了。但是这里的beanDefinition并不是真正的bean。只是一个bean定义信息而已;切记

Nettrace 源码分析 文章介绍:本文将围绕腾讯开源项目nettrace工具中数据采集,数据处理,数据分析三个模块深入源码分析其实现细节 阅读详情

相关推荐

TwinCAT 3 实战指南:从系统配置到高级运动控制

本文详细介绍了TwinCAT 3工业自动化控制平台的实战应用,从系统配置、PLC编程到EtherCAT总线配置和高级运动控制。通过倍福(Beckhoff)的TwinCAT 3平台,工程师可以高效实现复杂的工业自动化任务,包括运动控制、PLC编程等。文章还提供了常见问题排查和性能优化技巧,帮助用户提升系统稳定性和实时性。

weixin_30831529的博客 304

【Spring专题】Bean的生命周期流程图(未完结-持续更新)

我向来不主张【通过源码】理解业务,因为每个人的能力有限,甚至可能会因为阅读错误导致出现理解上的偏差,所以我决定,还是先帮大家【开天眼】,先整体看看流程图,好知道,Spring在写源码的过程中到底干了啥事情。

qq_32681589的博客 1423

基于STM32的频率计(采用外部中断的方式)

前言 最近在了解电赛相关的东西,和指导老师交流一下,我决定先从最简单的频率计做起。 频率计是来检测信号的频率的,在做频率计的时候可以用信号发生器发出的信号来进行测试。 原理 这是最基础的方波,我们可以通过检测上升沿的方式来测量其频率。从周期的角度出发连续两个上升沿的时间就是这个方波的周期,那这个周期分之一就是这个方波的频率了。 在思考了一段时间~~(我是萌新。。)~~ 我觉得有两个方法可以实现,第一个是采用stm32定时器的输入捕获功能,第二个就是用外部中断来实现这个功能。正如标题,我这次采用外部中断的方

qq_45784922的博客 6171

spring容器和bean加载流程图

上面这些类的作用和区别? 比如PostConstruct InitializingBean在使用上基本没啥区别,我觉得区别就在一个是spring的注解,一个是Java的注解(符合JSR定义的规范) ...

968

LightRAG实战:从零构建中药知识图谱,解锁六种检索模式效能对比

本文详细介绍了如何使用轻量级RAG框架LightRAG从零构建中药知识图谱的实战过程。通过本地部署环境搭建、开源模型配置与《本草纲目》数据导入,文章重点对比了Naive、Local、Global、Hybrid、Mix和Bypass六种检索模式在中药问答中的效能差异,并提供了可视化图谱与优化心得,为开发者构建专业领域智能问答系统提供了实用指南。

weixin_29096377的博客 176

基于PLC的图书馆机器人设计与仿真

本文设计了一种基于PLC的图书馆机器人系统,该系统能提升图书馆自动化管理水平,选用西门子S7-1200系列PLC作为核心控制单元,结合电机驱动、传感器采集以及超声波避障等技术,设计出机器人行走、图书识别与分拣的功能模块,系统借助条形码扫描模块获取图书信息,将其分析后与设定的存放位置做对比,精准达成图书的存取和归还。仿真结果显示,机器人执行任务时运动控制响应时间是0.35秒,避障成功率为98.3%,图书识别准确率高达99.4%,在控制系统方面,运用STEP7-MICRO/WIN软件编程,结合WINCC设计组态

weixin_44553616的博客 1924

Spring @Service生成bean名称的规则(当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致)

@Service标注的bean,类名:ABDemoService 查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致 public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C...

fz13768884254的博客 8173

Android开发者必看:5分钟搞定MQTT客户端连接EMQX服务器(附完整代码)

本文为Android开发者提供了一份快速实现MQTT客户端连接EMQX服务器的实战指南。通过引入Eclipse Paho SDK,详细讲解了从项目配置、权限申请到核心连接、主题订阅与消息发布的完整流程,并附有即拿即用的Kotlin代码,帮助开发者在物联网应用中高效集成轻量级实时通信功能。

weixin_29228781的博客 271

第8章 Spring加载Bean流程以及常用扩展点

加载Bean流程 这里画了Bean加载简版流程图。主要是为了搞清楚几个扩展加载顺序。 常用扩展点 1.Aware Aware 接口都是用来感知的。 BeanNameAware 用来感知Bean对象被容器管理的beanName BeanClassLoaderAware 可以给Bean对象设置类加载器 BeanFactoryAware 给Bean对象设置BeanFacory对象 Spring 在初始化Bean对象时,对Aware接口的处理 private void invokeAwareMethods(Str

Shiro框架02 568

安装Codex时出现无法下载此应用和Microsoft Store初始化失败的解决方案

本文主要介绍了安装Codex时出现无法下载此应用和Microsoft Store初始化失败的解决方案,希望能对使用codex的同学们有所帮助。 文章目录 1. 问题描述 2. Windows 解决方案 3. Mac解决方案

weixin_43178406的博客 7万+

Cadence PSpice 仿真0:绘制电路图方法图文教程

在使用PSpice进行电路的仿真时,首先需要使用带有PSpice模型的元器件来绘制电路图,本文简单介绍进行电路图绘制是常用的几种需要掌握的方法,以满足PSpice仿真绘制简单电路图所用。

fydar的博客 4703

汇总——三个图帮你搞懂spring的bean加载过程

汇总——三个图帮你搞懂spring的bean加载过程 终于把Spring bean加载的流程图都搞出来了,这里搞个汇总文章方便大家浏览。个人感觉看这三个图可以大概把bean加载的流程都理清楚。建议可以一边看源码一边对照着流程图看。若有不正确的地方,欢迎指出~ Spring的ApplicationContext加载(一) Spring的ApplicationContext加载(二)——AbstractBeanFactory.doGetBean方法流程图 Spring的ApplicationContext加载(

weixin_42440637的博客 467

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

spring源码解读-2.根据图纸创建bean实例

首先,找到容器刷新方法refresh();上一篇知道在执行完obtainFreshBeanFactory方法之后我们的bean定义信息已经加载出来,存在了 DefaultListableBeanFactory(它是同时也是一个BeanDefinitionRegistry)的默认实现中; ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); 今天继续开始引路,看看spring的bean是如何创建的; spring容器会

掀衣怒码 322

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深度学习工具包 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源码解读-5.容器生命周期之修改图纸

spring启动容器的时候允许在加载完成BeanDefinition(我称之为bean的图纸)对bean定义元数据信息进行修改;是通过一个叫做BeanFactoryPostProcessor的接口来实现的; 代码位置在refresh() 里面调用invokeBeanFactoryPostProcessors()的方法中; 代码逻辑不复杂,自己研究吧。因为使用场景很少,所以不多讲什么了。自己看看吧 public static void invokeBeanFactoryPostProcessors(

掀衣怒码 183

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

从Spring为什么要用IoC的支点,我撬动了整个Spring的源码脉络

纯粹盲目的去看Spring源码,你对Spring的知识就是一块一块的碎片,既不系统,也不结构化,更别说融会贯通了。你会觉得自己需要好好地梳理脉络,系统地掌握知识。你的这种感觉一定很强烈吧。源码本身只不过是解决问题的细节而已,而IoC思想才是主导Spring脉络的支点。不要为了捡芝麻,而丢了西瓜。...

YYniannian的博客 191

Java开发两年:简述jvm内存模型

前言 最其实不管什么时候,找工作都跑不了面试。目前很多小编都做了面试手册了,那就是别人家的孩子都有糖了,作为一个自觉的小编,必须搞。 容我先絮叨一下,制作这个面试手册差不多花了3个多星期时间,过程还是比较磨人的,但是也很期待。要是因为我做的手册,帮助到了大家,那就真的开心啊!这就是这篇文章的目的,**帮你搜集了大量的面试题,已经整理成了一个Java面试手册PDF,《互联网面试2400页》,目前有65份PDF,共有2400多页,**后续还会不断的完善更新。 直接进入正题,由于pdf文档里的细节内容实在过多所

m0_56662269的博客 77

花2万块买的教程!Java大厂高频面试题解析

前言 看日期,今天都是4月了,这春招也差不多进入尾声了。 近期任有不少朋友都在找工作,很多人开始抱怨,工作可真难找啊!身边不少朋友问我咋搞呀,秋招都要结束了,工作还没着落呢…额…这个…今年是有点难啊。说实话,面试只是对个人技术及应变能力的一次考验。只有解决了一个问题,你才有机会遇见下一个问题。 这不,今天我总结了饿了么4面(Java岗)面经,问题如下,都是真真的经历,准备面试找工作的朋友可自行检测一下。 二、Spring生命周期的大胆猜测 这里分享一个阅读源码的小技巧:捉大放小,连蒙带猜!8字真言,我们在

m0_57700125的博客 101

java接口开发面试,java开发视频教学

由于篇幅限制,小编在此截出几张知识讲解的图解外链图片转存中…(img-6rbMSnvw-1710993349848)][外链图片转存中…(img-y2zYPt8r-1710993349848)][外链图片转存中…(img-F2ORCY3D-1710993349849)]点击传送门,即可免费领取!

H1767410的博客 618

万字长文!mysql8安装失败

二、Spring生命周期的大胆猜测 这里分享一个阅读源码的小技巧:捉大放小,连蒙带猜!8字真言,我们在阅读源码过程中,因为你要知道,每一个被开源出来的优秀框架,其源码的体系都是极其庞大复杂的,我们不能面面俱到,所以在看源码过程中一定不能被细枝末节缠住,一定要先理清楚整个框架的一个大致思想和大致的框架体系,再去搞那些细枝末节,其效率会好很多,其次在看源码过程中,我们一定要大胆的去想,去猜测,如果这个功能让你自己去写,你会怎么实现! 我们今天学习SpringBean的生命周期也是按照这个8字真言去学习,通过我们

m0_57081438的博客 157

字节跳动面试分享:java工程师进阶路线

二、Spring生命周期的大胆猜测 这里分享一个阅读源码的小技巧:捉大放小,连蒙带猜!8字真言,我们在阅读源码过程中,因为你要知道,每一个被开源出来的优秀框架,其源码的体系都是极其庞大复杂的,我们不能面面俱到,所以在看源码过程中一定不能被细枝末节缠住,一定要先理清楚整个框架的一个大致思想和大致的框架体系,再去搞那些细枝末节,其效率会好很多,其次在看源码过程中,我们一定要大胆的去想,去猜测,如果这个功能让你自己去写,你会怎么实现! 我们今天学习SpringBean的生命周期也是按照这个8字真言去学习,通过我们

m0_58591044的博客 87

数据库性能优化面试题,最新大厂Java校招面试经验汇总

这样,等真的沉下心来学习,不至于被找资料分散了心神。另外,给大家安排了一波学习面试资料:以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰![外链图片转存中…(img-vJtcCSfz-1710213070049)]以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录。

m0_61549984的博客 426

BeanDefinition解密:构建和管理Spring Beans的基石

本文对BeanDefinition进行全面深入的探讨,涵盖BeanDefinition的接口方法、主要信息、类型以及生成过程等方面内容

华为云官方博客 1077

涨薪7K,java算法面试问题

注册销毁方法,以便Spring容器销毁的时候进行方法的销毁!

m0_61408947的博客 1023

hadoop集群搭建完整教程jdk,Java开发谈

分布式技术专题+面试解析+相关的手写和学习的笔记pdf《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!3)]《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

2401_84408437的博客 977

Java互联网架构师系统vip,java开发面试简历模板

其它面试题(springboot、mybatis、并发、java中高级面试总结等)[外链图片转存中…(img-LEfFXMJ6-1710250048965)][外链图片转存中…(img-rNhCaAYy-1710250048966)]点击传送门,即可免费领取!

VIP129370的博客 902

京东Java春招真题深度解析:集合、并发、JVM与MySQL

Java后端面试中,集合、并发、JVM与数据库是绕不开的核心考察点。以HashMap为例,从JDK 7到JDK 8的底层结构演变,展现了数据结构设计对性能与安全性的权衡;ConcurrentHashMap通过CAS+synchronized实现高并发下的读写安全,体现了细粒度锁的工程价值。JVM内存模型与GC算法则决定了线上调优的边界,而MySQL索引与事务隔离级别直接影响系统吞吐与数据一致性。这些技术原理不仅是大厂笔试的常客,更是真实业务中处理高并发、数据一致性问题的基石。本文以2019年京东Java春招

weixin_33816300的博客 484
上一篇: java快速插入海量数据
下一篇: spring源码解读-2.根据图纸创建bean实例
掀衣怒码
博客等级 码龄6年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值