干货!深入Spring核心组件原理解析,带你实战开发,吃透微服务

全网最系统、最清晰!深入微服务架构——Docker和K8s详解,助你大厂无忧 写在前边 Docker是个伟大的项目,它彻底释放了虚拟化的威力,让应用的分发、部署和管理都变得前所未有的高效和轻松! 如果你正在为以下问题困扰,就可以考虑使用Docker来对整个工程进行重构。 资源利用率问题 不同业务场景对资源的需求是不-样的,有CPU密集型、内存密集型、网络密集型,这就可能导致资源利用率不合理的问题。在大多数的企业中,我们经常能够看到服务器的资源闲置率非常高,而开发团队却经常面临无机器可用的情况。 混合部署交叉 影响对于线上服务,一台机器要混合部署多个服务,那么服务之间可能 阅读详情

前言

我们现在开发应用的方式和1年前、5年前、10年前都是不同的,更别提15年前了,当时RodJohnson的图书 Expert One-on-One J2EE Design and Development 介绍了Spring框架的初始形态。当时,最常见的应用形式是基于浏览器的Web应用,后端由关系型数据库作为支撑。尽管这种形式的开发依然有它的价值,Spring也为这种应用提供了良好的支持,但是我们现在感兴趣的还包括如何开发面向云的由微服务组成的应用,这些应用会将数据保存到各种类型的数据库中。

另外一个崭新的关注点是反应式编程,它致力于通过非阻塞操作提供更好的扩展性并提升性能。随着软件开发的发展,Spring框架也在不断变化,以解决现代应用开发中的问题,其中就包括微服务和反应式编程。Spring还通过引入Spring Boot简化自己的开发模型。

Spring 的核心

任何实际的应用程序都是由很多组件组成的,每个组件负责整个应用功能的一部分,这些组件需要与其他的应用元素进行协调以完成自己的任务。当应用程序运行时,需要以某种方式创建并引入这些组件。

干货!深入Spring核心组件原理解析,带你实战开发,吃透微服务

 

Spring Framework 总共有十几个组件,但真正核心的组件只有三个:Spring Core,Spring Context 和 Spring Bean,它们奠定了 Spring 的基础并撑起了 Spring 的框架结构。Spring 的其它功能特性例如 Web、AOP、JDBC 等都是在其基础上发展实现的。

Spring之中最重要的当属Bean了,Spring实际上就是面向Bean的编程,Bean对于Spring的意义就好比Object对于OOP的意义一样。那么,三个核心组件之间是如何协同工作的呢?如果把Bean比作一场演出中的演员,那么Context就是这场演出的舞台,Core就是演出的道具,至于演出的节目,就是Spring的一系列特色功能了。

我们知道Bean包裹的是Object,而Object中必然有数据,Context就是给这些数据提供生存环境,发现每个Bean之间的关系,为他们建立并维护好这种关系。这样来说,Context就是一个Bean关系的集合,这个关系集合就是我们所说的IOC容器。那么Core又有什么作用呢?Core就是发现、建立和维护每个Bean之间的关系所需的一系列工具,就是我们经常说的Util。

Bean 组件

Bean组件在Spring的org.springframework.beans包下,主要完成了Bean的创建、Bean的定义以及Bean的解析三件事。

SpringBean的创建是典型的工厂模式,其工厂的继承层次关系如图所示:

干货!深入Spring核心组件原理解析,带你实战开发,吃透微服务

 

Spring 使用工厂模式来管理程序中使用的对象(Bean),Bean 工厂最上层的接口为 BeanFactory,简单来看,工厂就是根据需要返回相应的 Bean 实例。

public interface BeanFactory {  
    //...          
    Object getBean(String name);  
} 																																																																																																						                                                                                                                                                                                                                           

在工厂模式中,在工厂的实现类中生成 Bean 返回给调用客户端,这就要求客户端提供生成自己所需类实例的工厂类,增加客户负担。Spring 结合控制反转和依赖注入为客户端提供所需的实例,简化了客户端的操作。具体的实现方式大致如下。

public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory  
        implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable {  
    /** Map of bean definition objects, keyed by bean name */  
    private final Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<String, BeanDefinition>;  
    public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition){       
        //...  
    }  
} 

beanDefinitionMap 作为具体的 Bean 容器,Spring 创建的对象实例保存其中。客户端需要时,使用工厂的 getBean 方法去试图得到相应的实例,如果实例已存在,则返回该实例;如果实例不存在,则首先产生相应实例并通过 registerBeanDefinition 方法将其保存在 beanDefinitionMap 中(Lazy Initialization),然后返回该实例给客户端。

干货!深入Spring核心组件原理解析,带你实战开发,吃透微服务

 

beanDefinitionMap 并不直接保存实例本身,而是将实例封装在 BeanDefinition 对象后进行保存。BeanDefinition 包含了实例的所有信息,其简化版的定义如下。

public class BeanDefinition {  
    private Object bean;  
    private Class<?> beanClass;  
    private String beanClassName;  
    // Bean 属性字段的初始化值  
    private BeanPropertyValues beanPropertyValues;  
    //...  
} 

Spring Bean 工厂生产 Bean 时

  1. 先将实例的类型参数保存到 beanClass 和 beanClassName,将需要初始化的字段名和值保存到 beanPropertyValues 中,这个过程 Spring 通过控制反转来实现,本文第二小节将予以简要说明
  2. 生成 bean 实例,并利用反射机制将需要初始化的字段值写入 bean 实例,将实例保存在 bean 中,完成 BeanDefinition 的构建。

假设我们已经完成了步骤 1) 的操作,之后的过程用代码表述如下所示。

public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition){  
    //生成 bean 实例,并完成初始化  
    Object bean = createBean(beanDefinition);  
    //将 bean 实例保存在 beanDefinition 中  
    beanDefinition.setBean(bean);  
    //将 beanDefinition 实例保存在 Spring 容器中  
    beanDefinitionMap.put(beanName, beanDefinition);  
}  
protected Object createBean(BeanDefinition beanDefinition) {  
    try{  
        Object bean = beanDefinition.getBeanClass().newInstance();  
        try {  
            setBeanPropertyValues(bean, beanDefinition);  
        } catch (NoSuchFieldException | SecurityException | IllegalArgumentException e) {  
            e.printStackTrace();  
        }  
        return bean;  
    }catch(InstantiationException e){  
        e.printStackTrace();  
    }catch(IllegalAccessException e){  
        e.printStackTrace();  
    }  
    return null;  
}  
protected void setBeanPropertyValues(Object bean, BeanDefinition beanDefinition) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException{ 
     for(PropertyValue pv : beanDefinition.getBeanPropertyValues().getBeanPropertyValues()){  
        Field beanbeanFiled = bean.getClass().getDeclaredField(pv.getName());  
        beanFiled.setAccessible(true);  
        beanFiled.set(bean, pv.getValue());  
    }  
} 

Context 组件

前面说到,Context组件的作用是给Spring提供一个运行时的环境,用以保存各个对象的状态,我们来看一下与Context相关的类结构图。

干货!深入Spring核心组件原理解析,带你实战开发,吃透微服务

 

从图中可以看出,Context类结构的顶级父类是ApplicationContext,它除了能标识一个应用环境的基本信息以外,还继承了5个接口,这5个接口主要是扩展了Context的功能。ApplicationContext的子类主要包含两个方向,图中已作说明。再往下就是构建Context的文件类型,接着就是访问Context的方式。

一般地,传统的程序设计中,无论是使用工厂创建实例,或是直接创建实例,实例调用者都要先主动创建实例,而后才能使用。控制反转(Inverse of Control) 将实例的创建过程交由容器实现,调用者将控制权交出,是所谓控制反转。

依赖注入(Dependence Injection) 在控制反转的基础上更进一步。如果没有依赖注入,容器创建实例并保存后,调用者需要使用 getBean(String beanName) 才能获取到实例。使用依赖注入时,容器会将 Bean 实例自动注入到完成相应配置的调用者,供其进一步使用。

Context 组件借助上述的控制反转和依赖注入,协助实现了 Spring 的 Ioc 容器。下面我们以一个 Service 类作为所需的 Bean 实例进行说明。实际应用中,我们会需要 Spring 管理很多 Bean 实例。

public class SampleService {  
    private String service;  
        public String getService() {  
        return service;  
    }  
    public void setService(String service) {  
        this.service= service;  
    }  
} 

在程序运行过程中,需要一个 SampleService ,我们不让调用者 new 一个实例,而是在配置文件中表明该 SampleService 的实例交由 Spring 容器进行管理,并指定其初始化参数。配置文件即资源,其内容如下。

<?xml version="1.0" encoding="UTF-8"?>  
<beans>  
    <bean name="sampleService " class="com.service.SampleService ">  
        <property name="service" value="This is a service"></property>  
    </bean>  
</beans> 

Spring Core 组件提供 ResourceLoader 接口,便于读入 xml 文件或其他资源文件。其核心功能代码应该提供如下方法。

public class ResourceLoader {  
    public Resource getResource(String location){  
        URL resource = this.getClass().getClassLoader().getResource(location);  
        return new UrlResource(resource);  
    }  
}  
// UrlResource 的功能代码  
public class UrlResource implements Resource {  
    private final URL url;  
    public UrlResource(URL url){  
        this.url = url;  
    }  
    @Override  
    public InputStream getInputStream() throws IOException {  
        URLConnection urlurlConnection = url.openConnection();  
        urlConnection.connect();  
        return urlConnection.getInputStream();  
    }  
}

即加载资源文件,并以数据流的形式返回。Context 根据资源中的定义,生成相应的 bean 并保存在容器中,bean 的名字是 sampleService ,供程序进一步使用。这样就完成了控制反转的工作。接下来就需要把 sampleService 注入到需要使用它的地方,亦即完成依赖注入操作。

现在假设 SampleController 中使用 SampleService 的对象,Spring 提供三种依赖注入的方式,构造器注入、setter 注入和注解注入。

public class SampleController {  
    /**  
     * 3\. 注解注入  
    **/  
    /* @Autowired */  
    private SampleService sampleService;  
    /**  
     * 1\. 构造器注入  
    **/  
    public SampleController(SampleService sampleService){  
        this.sampleService = sampleService;  
    }  
    //无参构造函数  
    public SampleController(){}  
    // 类的核心功能  
    public void process(){  
        System.out.println(sampleService.getService());  
    }  
    /**  
     * 2\. setter 注入  
    **/  
    /*public void setService(SampleService service) {  
        this.service= service;  
    }*/  
} 

三种注入方式在配置文件中对应不同的配置方式,在前面 xml 文件的基础上,我们可以分别实现这三种注入方式。需要注意的是,这里 SampleController 也是使用 Spring 的 Ioc 容器生成管理的。

<?xml version="1.0" encoding="UTF-8"?>  
<beans>  
    <bean name="sampleService " class="com.service.SampleService ">  
        <property name="service" value="This is a service"></property>  
    </bean>  
<!-- 1\. 构造器注入方式为SampleContorller 的 bean 注入 SampleService -->  
    <bean name="sampleContorller" class="com.controller.SampleContorller">  
        <!-- index 是构造方法中相应参数的顺序 -->  
        <constructor-arg index="0" ref="sampleService"></constructor-arg>  
    </bean>  
<!-- 2\. setter 注入方式为SampleContorller 的 bean 注入 SampleService -->  
<!--  
    <bean name="sampleContorller" class="com.controller.SampleContorller">  
        <property name="sampleService " ref="sampleService"></property>  
    </bean>  
-->  
<!-- 3\. 注解注入方式为SampleContorller 的 bean 注入 SampleService -->  
<!--  
    <bean name="sampleContorller" class="com.controller.SampleContorller">  
    <!-- 不需要配置,Spring 自动按照类型注入相应的 bean -->  
    </bean>  
-->  
</beans> 

Core组件

Core组件一个重要的组成部分就是定义了资源的访问方式。Core组价把所有的资源都抽象成一个接口,这样,对于资源使用者来说,不需要考虑文件的类型。对资源提供者来说,也不需要考虑如何将资源包装起来交给别人使用(Core组件内所有的资源都可以通过InputStream类来获取)。另外,Core组件内资源的加载都是由ResourceLoader接口完成的,只要实现这个接口就可以加载所有的资源。

干货!深入Spring核心组件原理解析,带你实战开发,吃透微服务

 

那么,Context和Resource是如何建立关系的呢?通过前面Context的介绍我们知道,Context组件里面的类或者接口最终都实现了ResourcePatternResolver接口,ResourcePatternResolver接口的作用就是加载、解析和描述资源。这个接口相当于Resource里面的一个接头人,它把Resource里的资源加载、解析和定义整合到一起,便于其他组件使用。

后记

这就是小编介绍的Spring三大核心组件的结构与相互关系,只是小编个人的见解,有不准确的地方,还请各位朋友们多多评论交流,喜欢文章的话,请多多点赞,关注小编,你们的支持就是小编最大的动力~~~

史上最全IO讲解,以源码角度为你剖析,颠覆你的认知! Java IO 是一个庞大的知识体系,很多人学着学着就会学懵了,包括我在内也是如此,所以本文将会从 Java 的 BIO 开始,一步一步深入学习,引出 JDK1.4 之后出现的 NIO 技术,对比 NIO 与 BIO 的区别,然后对 NIO 中重要的三个组成部分进行讲解(缓冲区、通道、选择器),最后实现一个简易的客户端与服务器通信功能。 传统的 BIO Java IO流是一个庞大的生态环境,其内部提供了很多不同的输入流和输出流,细分下去还有字节流和字符流,甚至还有缓冲流提高 IO 性能,转换流将字节 阅读详情

相关推荐

漫谈架构演变之路:为何要搞微服务架构?今天就为大家讲透!

有不少朋友或同事都问过我这个问题:为什么我们要搞微服务架构,一个项目把代码从头撸到尾不是很方便吗,开发更快速,部署也容易。而且一提起微服务,涉及的技术就一大堆,好像几辈子也学不完。 怎么解答这个问题呢?我想还是通过架构的发展变迁史来说起,为什么会出现现在的各种架构。只有从整体上了解了架构的脉络,我们才好更加全方位的评估一个架构。为此,我们有理由来梳理一下架构发展的来龙去脉,究竟为何会出现微服务,主要解决什么问题。微服务架构是最先进的架构吗? 本文我们来探索一下架构的变迁。以及从Java工程师的角度来

python6_quanzhan的博客 1225

spring 5企业级开发实战pdf_干货!深入剖析Spring核心组件原理,由实战开发,助你吃透微服务...

前言我们现在开发应用的方式和1年前、5年前、10年前都是不同的,更别提15年前了,当时RodJohnson的图书 Expert One-on-One J2EE Design and Development 介绍了Spring框架的初始形态。当时,最常见的应用形式是基于浏览器的Web应用,后端由关系型数据库作为支撑。尽管这种形式的开发依然有它的价值,Spring也为这种应用提供了良好的支持,但是我们...

weixin_39624461的博客 422

铺平你的架构师之路!十年技术专家敬献Java架构完美设计笔记

写在前面 软件架构师是每个程序员职业生涯中内功心法修炼的终极目标。当然要达到这个目标,一般并不简单,你需要具备“十八般武艺”,而且还要融汇各家所长。那么,该如何更好的理解架构呢? 从形上看,架构是系统结构的骨架,支撑和连接各个部分;从神上看,架构是系统设计的灵魂,深刻体现了业务技术实现的本质。 从纵向架构上看,架构涉及由客户端发送请求到服务器处理,再从服务器返回给客户端的各个主要步骤的具体处理细节;从横向架构上看,架构又关联到实现这种客户端——服务器端的架构模式。 而如果要成为一名优秀的架构师,你必

python6_quanzhan的博客 1207

干货!这才是真正的Spring全家桶,架构+源码+实战+微服务全都有!

一切技术的产生与发展都离不开最基本的原理,只要追本溯源,了解技术体系最基本、最底层的原理,我们就能根据这些知识储备建立自己的后端技术框架,从而搭建一条完整的成长道路。学Java就是学Spring,学Spring也就是吃透其核心IoC和AOP,这应该是我目前为止看到讲Spring源码讲的最好的笔记了,看着很少,但全是精华,没有一点点废话!

jcc4261的博客 549

计组头哥实验 实验三 MIPS寄存器实验

了解 MIPS 寄存器文件基本概念,进一步熟悉多路选择器、译码器、解复用器等 Logisim 组件的使用,并利用相关组件构建 MIPS 寄存器文件。

gdz0007的博客 1万+

FPGA与GPU异构计算:重塑嵌入式AI的算力边界与场景定义

本文深入探讨了FPGA与GPU异构计算如何突破嵌入式AI的算力瓶颈。通过分析工业视觉、智能交通及航天等场景,阐述了FPGA负责高速数据采集与预处理,GPU专注复杂AI推理的协同模式,有效解决了传统单一架构在算力、功耗、接口和实时性上的挑战,为嵌入式AI应用提供了高效能解决方案。

spice的博客 486

这套 Spring Boot+Dubbo 高并发项目,面试永远滴神!!!

1-3年的Java开发最缺什么?我最近面试了一个2年经验的Java开发工程师:从简历上来看挺不错的,但说到项目经验,一问全是业务的重复造轮子!不到一年开发经验的人也能做。这正应了我在知乎上...

程序员闪充宝 339

MT4/MT5数据源接入全攻略:从买服务、自研API到低成本DDE,哪种方案适合你?

本文全面解析MT4/MT5数据源接入的三种主流方案:商业服务、自研API和低成本DDE,详细对比其技术参数、成本结构和适用场景。帮助技术团队根据业务需求选择最优方案,确保外汇交易系统的数据流稳定性和实时性,提升交易体验和业务连续性。

weixin_42568801的博客 176

2024年最全太牛了!终于有人把Java程序员必学知识点整理出来了,【绝对干货】

Spring的特点Spring其核心组件Spring常用的模块Spring主要包Spring 常用注解Spring IOC原理Spring APO原理Spring MVC 原理Spring Boot 原理JPA 原理Mybatis 缓存Tomcat 架构。

2401_84103216的博客 765

MACS2软件进行Peak calling

MACS2可以检出ChIP-Seq,ATAC-seq 以及 MeRIP-seq (RNA甲基化测序) 等富集的序列。peaks calling 有不同的方法,MACS2是最常用的call peaks工具。 MACS全称Model-based Analysis of ChIP-Seq,最初的设计是用来鉴定转录因子的结合位点,但是它也可以用于其他类型的富集方式测序。usage: macs2 [-h] [--version] {callpeak,bdgpeakcall,bdgbroadca

qq_27390023的博客 3791

AI Agent开发大全第一课-AI是什么以及如何使用AI

近年来,人工智能的迅猛发展引发了广泛的关注,尤其是“大模型”这一概念越来越深入人心。大模型,顾名思义,通常指的是那些拥有大量参数、能够处理复杂任务的机器学习模型。与传统小模型相比,大模型在数据处理、信息理解和生成等方面表现更加出色。为了理解为什么现在的AI被称为大模型,我们需要深入探讨几个关键因素。立角色是指在提示词中清晰地界定交互双方的身份。明确用户希望模型扮演的角色,可以帮助模型更准确地理解上下文和用户需求。

打造全国最全的AI Agent开发知识领域的博客 1407

SpringBoot系列13:定时任务@Scheduled,动态启停定时任务+分布式锁防重复执行

本文摘要: 《SpringBoot原生定时任务生产级实战》专栏针对企业开发痛点,深度解析@Scheduled定时任务的原理与优化方案。内容涵盖:五大定时规则(Cron/fixedRate/fixedDelay)的底层机制与生产案例;实现动态启停任务与修改Cron表达式(无需重启服务);基于Redis分布式锁解决集群重复执行问题;线程池优化、任务阻塞/超时处理等生产避坑指南;提供企业级开发规范与高频面试题总结。通过原理+实战双闭环,提供零改造直接落地的解决方案,弥补原生@Scheduled在动态配置和集群防重

深耕 Java 后端与企业级软件架构设计,专注微服务、分布式系统、大模型 AI 应用架构落地。 345

Arduino、ESP32驱动AS3935数字闪电传感器(闪电传感器)

闪电传感器采用AMS独具创新的AS3935数字闪电传感芯片与Coilcraft的MA5532-AE专用天线,可在室内或室外,安全地检测方圆40km范围内发生闪电的距离,闪电相对强度与统计闪电发生次数。

不脱发的程序猿 2017

SpringBoot系列12:整合RabbitMQ消息队列,异步解耦、死信队列完整业务案例

本文介绍了SpringBoot整合RabbitMQ的实战指南,包含核心概念、生产级配置、四大交换机场景实现以及可靠性保障方案。主要内容包括: RabbitMQ核心价值:异步解耦、流量削峰、事件驱动、延时任务四大生产场景 核心组件详解:生产者、消费者、交换机、队列等概念 SpringBoot生产级配置:持久化、确认机制、重试策略、序列化优化 四大交换机实战:Direct直连、Topic主题、Fanout广播、Headers匹配 消息可靠性方案:确认机制、退回机制、持久化、消费者重试 生产避坑指南:重复消费、消

深耕 Java 后端与企业级软件架构设计,专注微服务、分布式系统、大模型 AI 应用架构落地。 334

dToF直方图之美_deadtime死区时间

IMX459的死区时间可以在6ns,这个时间是什么级别,车载激光雷达激光器的光脉宽一般都在4ns以上,也就是这个时间贴近去SPAD的死区时间,这就导致了pile up会非常弱,不会有太多数量的光子计数堆积,加上某些SPAD设计,对TDC有一些更深入的考量,所以不需要去校正pile up算法。Sensor层面决定了pile up的复杂程度,如果一个dToF的SPAD一致性非常好,那么pile up校正可以简单到极致,也就是一句代码的事,比如IMX611,优秀到不需要后端去考虑校正pile up。

dream it possible 1436

23 中望CAD二次开发(ZRX C++)-自定义实体(二)

本文详细介绍了自定义图形实体,如何实现几何变换、捕捉、节点编辑,并介绍了CAD代理的概念。

cilvsuanna的博客 438

结合双十一抢购项目实战!一文搞懂Dubbox、SpringBoot、Docket微服务架构

在这个凡事皆互联的时代,越来越多的人和物成为互联网上的节点,不断扩充着互联网这张大网的边界。节点即价值,更多的节点意味着更大的价值。那么如何去承载更多的节点就成为IT从业人士首要解决的问题。 今天小编就为大家介绍一篇对当下流行的Dubbox+Spring Boot+Docker微服务架构解决方案进行讲解的干货秘籍。主要内容包括微服务架构介绍、Dubbox 原理及运用、使用Spring Boot实现做服务、"使用ActiveMQ+Redis承载高并发流量、使用ActiveMQ实现分布式事务、分布式下的第三方

python6_quanzhan的博客 2248

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

为什么说微服务,要从前后端分离开始?一文就带你揭秘深入微服务架构

既要低头赶路,又要抬头望天,科技是为人服务的,任何技术背后都有更深层次的考量。 之前的文章中咱们聊了很多微服务的相关内容,简而言之,微服务的本质,就是一种可以加速分工、促进合作的新协作机制。知其然,知其所以然,今天我们再接着来聊聊怎样开启微服务架构之旅。 从前后端分离开启微服务改造 现在我们对微服务有了更深入的了解,也准备在构建新系统时采用这套新架构了,但它还是有些复杂度的,包括服务注册中心、统一配置中心、微服务网关、接入层网关、服务治理中心、调用链路追踪、分布式事务和分布式调度等众多组件。一口想吃成

python6_quanzhan的博客 1939

深度学习工具包 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")

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

干货!Spring Cloud微服务架构进阶,你还不了解的都在这里

前言 近年来,微服务架构一直是互联网技术圈的热点之一,越来越多的互联网应用都采用了微服务架构作为系统构建的基础,很多新技术和理念如Docker、Kubernetes、 DevOps、持续交付、Service Mesh等也都在关注、支持和跟随微服务架构的发展。 今天咱们就为大家推荐一本学习微服务架构进阶的秘籍,将会系统性地介绍微服务架构:包括微服务架构是如何演进的,微服务架构的主要流派,当前主流的云原生应用与微服务之间的关系等。 下面就跟着小编一起来一探究竟吧~~~ 本书特点 本书在介绍Spring

python6_quanzhan的博客 1913

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

华为18级大牛倾情奉送:分布式服务框架和微服务设计原理实战文档,啃完发现涨薪如此简单

前言 分布式服务框架不仅仅包含核心的运行时类库,还包括服务划分原则、服务化最佳实践、服务治理、服务监控、服务开发框架等,它是一套完整的解决方案,用来协助应用做服务化改造,以及指导用户如何构建适合自己业务场景的服务化体系,将服务化的价值发挥到极致。 基于分布式服务框架,业务终于可以把全部精力都放到应用层的逻辑开发,研发效率、系统可靠性都得到了极大的提升。目前,华为电信软件主要解决方案几乎所有的Java系统都基于分布式服务框架构建,底层的基础框架实现了统一。 近年来,随着DevOps和以Docker为首的

python6_quanzhan的博客 1851

腾讯T4大佬熬夜硬肝的全套微服务学习笔记,助你消除面试恐惧,金九银十直通大厂!

写在前面 微服务架构被认为是 IT 软件架构的未来方向。热度虽高,但对于很多中小公司来说微服务却是遥不可及,因为团队规模和能力又反过来制约了他们采用新技术的步伐。很多人对于微服务技术也都有着一些疑虑,比如: 微服务这技术虽然面试的时候总有人提,但作为一个开发,是不是和我关系不大?那不都是架构师的事吗? 微服务不都是大厂在玩吗?我们这个业务体量用得着吗? 微服务特别复杂,没个100人的研发团队是不是就无法落地? 其实不管是否能够用得着微服务,既然是大势所趋,就有学习的必要,以备不时之需,所以今天为大家

python6_quanzhan的博客 1518

20道阿里面试必问JVM面试专题(文末附送答案及JVM学习文档)

前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高。通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初衷以及每个环节的意义,有的放矢…… 而JVM 是 Java 程序运行基础,面试时一定会遇到 JVM 相关的题。所以我们准备了部分的面试真题,作为参考,看看你距离阿里还差多远。 1. 内存模型以及分区,需要详细到每个区放什么。 2. 堆里面的分区:Eden,survival (f.

python6_quanzhan的博客 1376

2020年了,还不知道微服务?一文告诉你微服务和Spring的联结关系

前言 作为软件开发者,我们一直处于一片混乱和不断变化的海洋之中,这已是软件开发领域中的一个常态。新技术与新方案的突然涌现会让我们受到强烈的冲击,使我们不得不重新评估应该如何为客户搭建和交付解决方案。 使用微服务开发软件被许多组织迅速采纳就是应对这种冲击的一个例子。微服务是松耦合的分布式软件服务,这些服务执行少量的定义明确的任务。 什么是微服务 在微服务的概念逐步形成之前,绝大部分基于Web的应用都是使用单体架构的风格来进行构建的。在单体架构中,应用程序作为单个可部署的软件制品交付,所有的UI (

python6_quanzhan的博客 1102

12年开发大佬,熬夜4个月整理的SpringBoot实战派,绝对涨薪秘籍

写在前面 Java (面向对象编程语言)经过30多年的发展,产生了非常多的优秀框架。Spring (为解决企业应用程序开发的复杂性而创建的框架)曾是最受欢迎的Java框架之一, 但随着Node、Ruby、Groovy、PHP等脚本语言的蓬勃发展,使用Spring开发应用就显得繁琐了,因为它使用了大量的XML配置文件,配置繁琐,整合不易,开发和部署效率低下。这时急切需要一种新的能解决这些问题的快速开发框架,于是Pivotal Software公司在2013开始了Spring Boot的研发。 Spring

python6_quanzhan的博客 1037

阿里P8大佬带来的SpringCloud微服务构建文档,绝对的深入浅出

前言 软件系统的架构经过一步步演进和发展,经历了单体架构、分布式应用架构、微服务架构、服务网格架构、Serverless架构……其中,单体架构经历了简单单体时期(例如经典的JSP)、MVC 分层时期(各种MVC框架受到追捧)、前后端分离时期。 从整体上看,这一次次的演进是软件垂直和水平方向上的拆分,屏蔽了底层与重新定位。在演进过程中,软件开发人员的关注点越来越远离底层的部分,更多地关注上层简单的架构,技术团队的职能划分也越来越清晰。这使得软件的研发过程更高效,质量更可控,工期也更易评估。从这个角度来看,

python6_quanzhan的博客 1027

时隔三月,参加2020秋招散招,终拿字节跳动后端开发意向书

写在前面 3个月前头条正式批笔试4道编程题只AC了2道,然后被刷了做了200多道还是太菜了,本来对字节不抱太大希望,毕竟后台竞争太大,而且字节招客户端开发比较多。后来看到有散招免笔试,抱着试一试的心态投了,然而几天过去毫无反应,20天后突然告诉我进行面试。8.10一面,8.12二三面,之后8.25晚上收到电话,拿到意向书。 字节跳动后端一面(纯技术面) 队列的实现,需要注意的地方 快速排序的实现、时间复杂度分析 B树和B+树的区别、应用 HashMap的实现,扩容机制,扩容时如何保证可操作

python6_quanzhan的博客 962
上一篇: 全网最全!高并发分布式锁架构解密,带给你独一无二的认知体验
下一篇: 不了解Redis双向链表,还说精通Redis?今天就为你讲透这面试盲区
Java领域指导者
博客等级 码龄7年 404粉丝 265原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值