- 浏览: 340974 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
yueshang520:
太厉害了
Spring读取XML配置源码解析 -
levin_china:
jianyan163qq 写道好文章!我现在遇到一个调用的问题 ...
Java中Runtime.exec的一些事 -
wenlongsust:
exec可能存在注入漏洞,如何控制安全问题啊?
Java中Runtime.exec的一些事 -
RainWu:
...
设计模式感触之代理模式应用 -
ch_dj:
面向对象涉及原则:1.开闭原则2.少用继承,多用聚合3.针对 ...
设计模式感触之代理模式应用
在Spring中,配置文件主要格式是XML,spring 本身提供了很多 xml namespace 的配置,如 jms、aop 等。并且,Spring提供了很多扩展点来供用户来实现自己的配置,这究竟是怎么实现的呢?让我们来一探究竟。
让我们从XmlBeanFactory开始吧。在这个类中:
public class XmlBeanFactory extends DefaultListableBeanFactory { private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); public XmlBeanFactory(Resource resource) throws BeansException { this(resource, null); } public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException { super(parentBeanFactory); this.reader.loadBeanDefinitions(resource); } }
spring使用 XmlBeanDefinitionReader 来读取并解析 xml 文件,XmlBeanDefinitionReader 是 BeanDefinitionReader 接口的实现。BeanDefinitionReader 定义了 spring 读取 bean 定义的一个接口,这个接口中有一些 loadBeanDefinitions 方法,从它们的方法签名可知,spring 把读取 bean 配置的来源抽象为 Resource 接口。BeanDefinitionReader 接口有两个具体的实现,其中之一就是从 xml 文件中读取配置的 XmlBeanDefinitionReader,另一个则是从 java properties 文件中读取配置的 PropertiesBeanDefinitionReader。开发人员也可以提供自己的 BeanDefinitionReader 实现,根据自己的需要来读取 spring bean 定义的配置。在 XmlBeanFactory 中创建了 XmlBeanDefinitionReader 的实例,并在 XmlBeanFactory 的构造方法中调用了 XmlBeanDefinitionReader 的 loadBeanDefinitions 方法,由 loadBeanDefinitions 方法负责加载 bean 配置并把 bean 配置注册到 XmlBeanFactory 中。
可以看到,XmlBeanFactory是使用XmlBeanDefinitionReader来读取XML文件的。而这个实际读取转发转发到XmlBeanDefinitionReader的loadBeanDefinitions方法:
public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader { …… private DocumentLoader documentLoader = new DefaultDocumentLoader(); public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException { return loadBeanDefinitions(new EncodedResource(resource)); } public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { …… try { InputStream inputStream = encodedResource.getResource().getInputStream(); try { InputSource inputSource = new InputSource(inputStream); if (encodedResource.getEncoding() != null) { inputSource.setEncoding(encodedResource.getEncoding()); } return doLoadBeanDefinitions(inputSource, encodedResource.getResource()); } finally { inputStream.close(); } } …… } protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { try { int validationMode = getValidationModeForResource(resource); Document doc = this.documentLoader.loadDocument( inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware()); return registerBeanDefinitions(doc, resource); } …… } …… }
loadBeanDefinitions 方法首先要通过 Resource 接口读取 xml 配置文件,并把它读到一个 Document 对象中,用于解析,这个动作是由接口 DocumentLoader 的实现来完成的。spring 有一个默认实现 DefaultDocumentLoader。
可以发现,上面定义了一个documentLoader,很明显,矛头转向DefaultDocumentLoader的loadDocument方法,请看:
public class DefaultDocumentLoader implements DocumentLoader { private static final String SCHEMA_LANGUAGE_ATTRIBUTE = "http://java.sun.com/xml/jaxp/properties/schemaLanguage"; private static final String XSD_SCHEMA_LANGUAGE = "http://www.w3.org/2001/XMLSchema"; public Document loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationMode, boolean namespaceAware) throws Exception { DocumentBuilderFactory factory = createDocumentBuilderFactory(validationMode, namespaceAware); if (logger.isDebugEnabled()) { logger.debug("Using JAXP provider [" + factory.getClass().getName() + "]"); } DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler); return builder.parse(inputSource); } protected DocumentBuilderFactory createDocumentBuilderFactory(int validationMode, boolean namespaceAware) throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setNamespaceAware(namespaceAware); if (validationMode != XmlValidationModeDetector.VALIDATION_NONE) { factory.setValidating(true); if (validationMode == XmlValidationModeDetector.VALIDATION_XSD) { // Enforce namespace aware for XSD... factory.setNamespaceAware(true); try { factory.setAttribute(SCHEMA_LANGUAGE_ATTRIBUTE, XSD_SCHEMA_LANGUAGE); } catch (IllegalArgumentException ex) { ParserConfigurationException pcex = new ParserConfigurationException( "Unable to validate using XSD: Your JAXP provider [" + factory + "] does not support XML Schema. Are you running on Java 1.4 with Apache Crimson? " + "Upgrade to Apache Xerces (or Java 1.5) for full XSD support."); pcex.initCause(ex); throw pcex; } } } return factory; } protected DocumentBuilder createDocumentBuilder( DocumentBuilderFactory factory, EntityResolver entityResolver, ErrorHandler errorHandler) throws ParserConfigurationException { DocumentBuilder docBuilder = factory.newDocumentBuilder(); if (entityResolver != null) { docBuilder.setEntityResolver(entityResolver); } if (errorHandler != null) { docBuilder.setErrorHandler(errorHandler); } return docBuilder; } }
对于如何读取一个 xml 文件为 Document 对象,大部分都很熟悉:创建 DocumentBuilderFactory,由 DocumentBuilderFacoty 创建 DocumentBuidler,调用 DocumentBuilder 的 parse 方法把文件或流解析为 Document。的确 spring 也是这样做的,但有一点不要忘记,spring 需要使用 xml schema 来验证 xml,spring 使用的 jaxp 1.2 中提供的 xml schema 验证方式,并没有使用 jaxp 1.3 中引入的 Schema 对象来验证(jboss cache 也是使用的这种方式)。DefaultDocumentLoader 在创建了 DocumentBuilderFactory 对象后会判断当前是否使用 xml schema 验证,如果是则会在 DocumentBuiderFactory 上设置一个属性,这个属性名为 http://java.sun.com/xml/jaxp/properties/schemaLanguage,如果把这个属性设置为 http://www.w3.org/2001/XMLSchema,jaxp 则会使用 xml schema 来验证 xml 文档,使用这种验证方式需要提供一个 EntityResolver 的实现,EntityResolver 的使用 DocumentBuilder 的 setEntityResolver 方法设置。spring 提供了 EntityResolver 的实现,这个实现也是扩展 spring 的关键所在。
在完成了 Resource 到 Document 的转换后,下面就是从 Document 中解析出各个 bean 的配置了,为此 spring 又抽象了一个接口 BeanDefinitionDocumentReader,从它的名称中可以一目了然这个接口负责从 Document 中读取 bean 定义,这个接口中只定义了一个方法 registerBeanDefinitions。spring 也提供了一个默认实现 DefaultBeanDefinitionDocumentReader。
public class XmlBeanDefinitionReader extends AbstractBeanDefinitionReader { protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { try { …… return registerBeanDefinitions(doc, resource); …… } public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException { // Support old XmlBeanDefinitionParser SPI for backwards-compatibility. if (this.parserClass != null) { XmlBeanDefinitionParser parser = (XmlBeanDefinitionParser) BeanUtils.instantiateClass(this.parserClass); return parser.registerBeanDefinitions(this, doc, resource); } // Read document based on new BeanDefinitionDocumentReader SPI. BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader(); int countBefore = getRegistry().getBeanDefinitionCount(); documentReader.registerBeanDefinitions(doc, createReaderContext(resource)); return getRegistry().getBeanDefinitionCount() - countBefore; } ……}
DefaultBeanDefinitionDocumentReader 主要完成两件事情,解析 <bean> 元素,为扩展 spring 的元素寻找合适的解析器,并把相应的元素交给解析器解析。第一个任务,解析 <bean> 元素,这个 spring 的核心功能及 IoC 或者是 DI,这由 spring 自己来处理,这个工作有一个专门的委托类来处理 BeanDefinitionParserDelegate,由它来解析 <bean> 元素,并把解析的结果注册到 BeanDefinitionRegistry(XmlBeanFactory 实现了此接口) 中。
public class DefaultBeanDefinitionDocumentReader implements BeanDefinitionDocumentReader { public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) { this.readerContext = readerContext; logger.debug("Loading bean definitions"); Element root = doc.getDocumentElement(); BeanDefinitionParserDelegate delegate = createHelper(readerContext, root); preProcessXml(root); parseBeanDefinitions(root, delegate); postProcessXml(root); } protected BeanDefinitionParserDelegate createHelper(XmlReaderContext readerContext, Element root) { BeanDefinitionParserDelegate delegate = new BeanDefinitionParserDelegate(readerContext); delegate.initDefaults(root); return delegate; } protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { if (delegate.isDefaultNamespace(root.getNamespaceURI())) { NodeList nl = root.getChildNodes(); for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i); if (node instanceof Element) { Element ele = (Element) node; String namespaceUri = ele.getNamespaceURI(); if (delegate.isDefaultNamespace(namespaceUri)) { parseDefaultElement(ele, delegate); } else { delegate.parseCustomElement(ele); } } } } else { delegate.parseCustomElement(root); } } …… }
那么 spring 如何来区别 bean 元素以及其它扩展元素的,大家可能很自然地就能想到使用元素名啊,的确使用元素名可以处理,但这就会出现这样的情况,程序员 A 扩展 spring 定一个元素名为 c 的元素,同样程序员 B 扩展 spring 也定义了名为 c 的元素,此时就无法区分了。其实 spring 是通过 xml namespace 来区分的,同样查找扩展元素的解析器也是通过 xml namespace 来处理的。spring 从根元素开始,在解析每个元素的时候,都会先查询元素的 namespace uri,如果元素的 namespace uri 为 http://www.springframework.org/schema/beans,则由 spring IoC 来解析处理,这些元素包括 beans、bean、import、alias,如果 namespace uri 不是 http://www.springframework.org/schema/beans,则会使用 NamespaceHandlerResolver 来解析出一个 NamespaceHandler,使用 NamespaceHandler 来解析处理这个元素。NamespaceHandlerResovler 和 NamespaceHandler 就是扩展 spring 的秘密所在。NamespaceHandlerResolver 是一个接口,spring 使用与 EntityResolver 相同的策略来实现,这个后面会提到。当这一步完成了 spring 也就完成了读取解析 xml 配置。
public static final String BEANS_NAMESPACE_URI = "http://www.springframework.org/schema/beans"; public boolean isDefaultNamespace(String namespaceUri) { return (!StringUtils.hasLength(namespaceUri) || BEANS_NAMESPACE_URI.equals(namespaceUri)); } public BeanDefinition parseCustomElement(Element ele) { return parseCustomElement(ele, null); } private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { if (DomUtils.nodeNameEquals(ele, IMPORT_ELEMENT)) { importBeanDefinitionResource(ele); } else if (DomUtils.nodeNameEquals(ele, ALIAS_ELEMENT)) { processAliasRegistration(ele); } else if (DomUtils.nodeNameEquals(ele, BEAN_ELEMENT)) { processBeanDefinition(ele, delegate); } } public BeanDefinition parseCustomElement(Element ele, BeanDefinition containingBd) { String namespaceUri = ele.getNamespaceURI(); NamespaceHandler handler = this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri); if (handler == null) { error("Unable to locate Spring NamespaceHandler for XML schema namespace [" + namespaceUri + "]", ele); return null; } return handler.parse(ele, new ParserContext(this.readerContext, this, containingBd)); }
public static final String BEAN_ELEMENT = BeanDefinitionParserDelegate.BEAN_ELEMENT; public static final String ALIAS_ELEMENT = "alias"; public static final String IMPORT_ELEMENT = "import";
在 spring 的源代码目录中有两个很特殊的文件:spring.schemas 和 spring.handlers,这两个文件以及 spring 中对 EntityResolver 和 NamespaceHandlerResolver 的实现 PluggableSchemaResolver 和 DefaultNamespaceHandlerResolver 是扩展 spring 的关键所在。其实 spring.schemas 和 spring.handlers 文件是标准的 java properties 文件。这两个文件都被大包到 spring jar 包中的 META-INF 目录中,PluggableSchemaResolver 通过读取 spring.schemas 文件,根据 xml 文件中实体的 system id 来解析这些实体,大家可以看一下 spring.schemas 文件中的 key 就可以知道 system id 是什么了(其实我也不知道 system id 和 public id 是啥,知道的朋友不妨在文后的回复中给我留言,谢谢);而 DefaultNamespaceHandlerResolver 则是根据元素的 namespace uri 在 spring.handlers 文件中查找具体的 NamespaceHandler 的实现。
public interface NamespaceHandlerResolver { /** * Resolve the namespace URI and return the located {@link NamespaceHandler} * implementation. * @param namespaceUri the relevant namespace URI * @return the located {@link NamespaceHandler} (may be <code>null</code>) */ NamespaceHandler resolve(String namespaceUri); }
如上面所提到的,扩展 spring 需要完成以下几个工作,定义一个 xml schema,并编写相应的 spring.schemas 文件,实现 NamespaceHandler 接口,根据需要还可能需要实现 BeanDefinitionParser 和 BeanDefinitionDecorator 等接口,更详细的信息可以参考 spring 的 reference 或者其他 spring 相关的文档
开源社区里不知道是哪位神人开发了 xbean 这样一个框架。这个框架具体做什么呢,它主要完成三件事情,第一根据源代码中的一些特殊的 doclet 生成一个 xml schema,看看 activemq 的源代码,大家可能会发现,很多类的 javadoc 中多了这样一个 tag @org.apache.xbean.XBean 以及其它的一些 tag,xbean 会根据这些特殊的 tag 来生成一个 xml schema;xbean 完成的第二件事情就是它会生成扩展 spring 所需的一些配置;第三它重新实现了一些 spring 中的可替换组件,如它扩展了 XmlBeanDefinitionReader 实现了自己的 BeanDefinitionReader XBeanXmlDefinitionReader,实现了自己的 ApplicationContext ResourceXmlApplicationContext,如果使用了 xbean 就必须使用 xbean 实现的 ApplicationContext。xbean 提供的 BeanDefinitionReader 实现只是把一些定制的元素转换成了 spring 中的 bean 元素,这样使 spring 的配置更容易阅读和理解。
此文参考:
发表评论
-
Hadoop源码编译到eclipse
2013-12-31 11:13 1117将Hadoop源代码导入eclipse,是使用命令: ... -
ZooKeeper源码分析之启动
2012-10-01 16:08 0Full thread dump Java HotSpo ... -
Spring注入非单例bean以及scope的作用范围
2012-08-30 08:18 31647一、 问题描述 在大部分情况下,容器中的b ... -
设计模式感触之代理模式-远程代理
2012-01-08 16:33 37721 远程代理的意义 远程代理为一个位于不同的地址空间的 ... -
设计模式感触之代理模式应用
2012-01-03 17:30 4463设计模式感触之代理模式应用 如果说看完设计模式之 ... -
Spring事务处理过程分析
2011-12-17 16:46 0org.springframework.transaction ... -
Tomcat启动错误的几件事
2011-12-14 10:41 8734第一件事:新建项目时在Dynamic web module v ... -
UML2.0中的Property和Attribute
2011-11-09 09:58 1011仅仅描述原文,进行一定的翻译,细节再慢慢体会: ... -
Servlet path与映射策略
2011-11-08 09:38 8830三点: 1. 请求URI = context path ... -
[转]Spring包结构解析及相互依赖
2011-11-05 18:49 1828spring.jar是包含有完整发布的单个jar包,sprin ...
相关推荐
中国人工智能产业发展联盟金融大模型落地路线图研究报告2024年56页.pdf
USB运动控制开源系统揭秘:五轴雕刻机核心技术全开源,支持RTCP算法,PCB生产便捷,C++源码可复制,USB运动控制五轴雕刻机系统完全开源资料,含PCB生产支持及多版本C++源码,USB运动控制 (五轴雕刻机系统)全部开源 不保留任何关键技术,PCB可直接生产,C++6.0源码,从13.7-18.2所有版本,本产品为可复制资料,支持五轴联动,支持RTCP算法,全部开源。 1、为电子资料 2、PCB底板+原理图+源码 ,核心关键词:USB运动控制; 五轴雕刻机系统; 开源技术; 不保留关键技术; C++6.0源码; 版本范围(13.7-18.2); 可复制资料; 五轴联动; RTCP算法; PCB底板; 原理图。,开源五轴雕刻机系统:USB运动控制全解析
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
基于16QAM的SIMULINK与MATLAB联合仿真系统:调制解调波形分析与应用拓展,基于MATLAB和SIMULINK平台的16QAM调制与解调仿真研究及波形分析,16QAM SIMULINK 基于SIMULINK和MATLAB的16QAM调制和解调。 采用SIMULINK搭建框图,MATLAB调用模型得出波形图。 (可自行简单修改在SIMULINK中加scope,无须MATLAB调用) ,核心关键词: 16QAM; SIMULINK; MATLAB; 调制; 解调; 波形图; 框图; Scope,基于SIMULINK的16QAM调制解调系统研究
基于PMSM模型的四种控制策略对比研究:传统滑膜控制与扰动观测器的优化与应用,基于滑膜控制扰动观测器的PMSM模型:四控制策略对比分析与实践应用研究 [附带视频与出图程序],基于滑膜控制扰动观测器的永磁同步电机PMSM模型 四个控制对比: 1、PID控制器 2、传统滑模控制器 3、最优滑模控制器 4、改进补偿滑膜控制器 [1]附带简单讲解视频 如下图 [2]附带出图程序,四个控制对比的说明文档(2篇,非次品) ,核心关键词:滑膜控制; 扰动观测器; 永磁同步电机PMSM模型; PID控制器; 传统滑模控制器; 最优滑模控制器; 改进补偿滑膜控制器; 简单讲解视频; 出图程序; 对比说明文档。,PMSM模型下的滑膜控制:四法比拼,解析与可视化
Abaqus USDFLD子程序:实现积分点间材料弹性连续变化仿真的高效方法,Abaqus USDFLD子程序:实现积分点间材料弹性连续变化仿真的高效方法,Abaqus USDFLD子程序实现积分点间材料弹性连续变化仿真 ,Abaqus; USDFLD子程序; 积分点; 材料弹性; 连续变化仿真;,Abaqus USDFLD实现材料弹性连续变化仿真
内容概要:本文档为《早中期复习—数字信号处理》的学习指南,详细介绍了数字信号处理的相关概念和方法,旨在梳理并巩固相关领域的知识点。文档内容涵盖数字信号处理基本概念及时域离散信号和系统的分析方法;重点探讨时域离散信号、离散傅里叶变换及其快速算法(FFT);详细介绍了基于离散信号变换方法的不同类型滤波器的设计;此外还列举了部分经典的面试题目及其解答方向,以辅助备考者准备面试。文档有助于深入理解和掌握这一学科,提高对信号分析技能的认知和应用。 适合人群:本指南主要面向正在备战考试或从事相关工作的初学者,尤其是需要系统性复习并加强理论理解和实际操作技巧的学生和工程师。 使用场景及目标:可用于准备研究生入学面试或者作为工程师日常工作中处理复杂工程问题时的参考手册。目标是帮助使用者加深对数字信号处理的认识,掌握关键技术和应用场景,以便更好地应对学术和工业挑战。 其他说明:文档结构清晰、条理性强,配合大量例题和图示,有利于读者理解和记忆。同时,提供了实用的小贴士和思考题,引导读者积极思考,拓展视野,培养独立解决问题的能力。
题目2.5(模拟浏览器操作程序):标准Web浏览器具有在最近访问的网页间后退和前进的功能。实现这些功能的个方法是:使用两个栈,追踪可以后退和前进而能够到达的网页。
SensorTower2024年AI应用市场洞察报告31页.pdf
chromedriver-win32-136.0.7055.0.zip
COMSOL热流耦合拓扑优化:最大化放热量与功率耗散策略解析,Comsol热流耦合拓扑优化技术:以最大化放热量与功率耗散为目标函数的优化策略,Comsol热流耦合拓扑优化。 目标函数采用最大化放热量和功率耗散。 ,Comsol;热流耦合;拓扑优化;目标函数;最大化放热量;功率耗散,Comsol热流耦合优化:最大化放热与功率耗散
内容概要:本文介绍了将假肢测试与实时混合子结构(RTHS)方法相结合的技术背景。RTHS方法用于将完整的动态系统分解为数值部分(numerical part)和实验部分(experimental part),并在Simulink中进行建模。数值部分包括模拟截肢者的模型,而实验部分则涉及真实的机械臂和假肢。两者通过传输系统耦合,实现了步行阶段的动态交互。文章具体描述了不同步态阶段的动力学模拟流程,包括飞行阶段(抬脚离地)和接触阶段(脚触地)。为了实现有效的仿线,提出了对机械臂的四个关键要求:能够执行接口运动、承受界面力、低延迟高精度以及实现实时通信。 适合人群:从事生物力学、医疗器械和机器人技术研究的专业人士及科研人员。 使用场景及目标:适用于需要对假肢进行动态性能测试的研发机构或企业,目标是选择合适的机械臂并构建完整的假肢测试平台,提高仿线的准确性和可靠性。 阅读建议:重点理解和掌握RTHS方法的工作原理以及机械臂在仿真实验中的角色,在实践中注意验证机械臂是否符合所列出的各项要求。
FLUENT与MATLAB协同:基于UDP的复杂数据联合仿真计算与交互处理方案,FLUENT与MATLAB协同:基于UDP的复杂数据联合仿真处理系统,FLUENT与MATLAB联合仿真计算,基于UDP,可在MATLAB实现复杂数据计算处理。 提供两个软件数据交互方法和接口,FLUENT数据传递给MATLAB后,可以用任意方法处理,最后再回传给FLUENT处理后的数据。 本案例只是简单演示效果,可以实现复杂功能。 ,联合仿真计算; UDP接口通信; 数据处理; 交互方法; 回传数据; 复杂功能演示。,FLUENT与MATLAB协同:UDP接口数据交互与复杂处理
postgresql安装教程.md
IPMSM数学模型深度解析:双环模拟技术,预测电机对多样输入的响应,精准输出电流、转速与转矩,IPMSM模型分析电机响应,IPMSM数学模型,模拟电机对不同输入的响应,包含速度环和电流环,输出电流转速和转矩。 ,IPMSM数学模型; 电机响应模拟; 速度环和电流环; 输出电流转速和转矩; 电机控制,IPMSM模型模拟电机响应:双环控制下电流转速与转矩输出
基于CNN-RBF神经网络的优化数据分类预测模型——以交叉验证防止过拟合的Matlab代码实现,Matlab结合CNN-RBF进行数据分类优化,基于卷积神经网络结合径向基函数神经网络(CNN-RBF)的数据分类预测 CNN-RBF数据分类 优化参数为扩散速度,采用交叉验证防止过拟合 matlab代码 注:要求 Matlab 2019A 及以上版本 ,核心关键词: 卷积神经网络(CNN); 径向基函数神经网络(RBF); 数据分类预测; 优化参数; 扩散速度; 交叉验证; 过拟合; MATLAB代码 2019A以上版本,基于CNN-RBF的优化参数数据分类预测Matlab代码实现
多变量模式分析在脑电数据中的深度应用:从磁共振到时频域的神经表征研究,多变量模式分析在脑电数据中的深度应用:从磁共振到时频域的神经表征研究,多变量模式分析最早应用在磁共振数据中,用来考察某些脑区在编码不同条件的刺激时是否存在表征上的显著不同。 后来逐渐运用到脑电数据中,虽然脑电数据的空间分辨率较低,但时间分辨率很高,因此可以帮助确定在哪一段时间内,个体对不同条件刺激的表征有显著差异。 目前已经有很多工具箱支持脑电数据MVPA的分析,例如matlab中ADAM,python中的NeuroRA等(这两个相对来说比较好上手)。 方法共包括基础的时间序列解码,以及衍生方法跨时域解码与权重投射等。 MVPA不仅可以应用在原始时域数据上,也可以应用在时频域数据上,来观察不同频段的能量对于编码不同刺激过程中的贡献。 ,多变量模式分析(MVPA);磁共振数据;脑电数据;时间分辨率;工具箱支持;ADAM;NeuroRA;时间序列解码;跨时域解码;权重投射;时频域分析。,多变量模式分析在脑电数据中的应用:从磁共振到时频域的表征研究
更多毕业设计https://cv2022.blog.csdn.net/article/details/124463185
系统选用B/S模式,后端应用springboot框架,前端应用vue框架, MySQL为后台数据库。 本系统基于java设计的各项功能,数据库服务器端采用了Mysql作为后台数据库,使Web与数据库紧密联系起来。 在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。
内容概要:本文档详细介绍了基于单片机的点阵电子显示屏的设计与实现项目。项目涵盖从理论背景、项目目标、硬件设计、软件开发到最后的应用与未来扩展等多个方面。首先阐述了点阵显示屏的广泛应用和技术背景,接着定义了项目的具体目标,包括实现文字滚动、图像展示等功能,同时深入解析了硬件部分的选型和连接细节,如单片机(STM32)、LED点阵模块及其驱动电路。在软件部分,文中演示了I2C通信协议的代码示例,并展示了如何通过嵌入式编程控制显示屏的效果,如显示固定字符、实现文字滚动等。此外,文章还讨论了调试和优化的方法论及注意事项,最后对未来发展方向提出了展望,如多显示屏协同、触摸屏输入的支持等。 适合人群:从事嵌入式系统开发的专业技术人员、电子工程专业的大学生及研究人员。 使用场景及目标:①嵌入式系统开发课程的案例研究;②工业设计公司或科研单位的项目参考;③高校实验室开展相关课题的研究资料。 阅读建议:对于初次接触嵌入式开发的新手,建议先掌握基础知识,熟悉所使用的单片机型及其外设接口功能后再开始本项目的学习;而对于有经验的研发人员,则可以重点关注具体的实现技术和遇到问题时的解决方案部分,结合自身需求进行灵活运用。