spring aop学习9:Aop的链式调用(责任链模式)

Java面试八股文:核心考点与实战解析 Java作为主流编程语言,其技术体系涵盖面向对象、JVM机制、并发编程等核心领域。理解封装继承多态的字节码实现、掌握HashMap扩容机制与红黑树转换等集合框架原理,是开发者必备的基础能力。在JVM层面,内存区域划分与GC算法直接影响应用性能,而类加载机制和字节码技术则是框架实现的底层支撑。并发编程中synchronized锁升级和AQS实现原理,以及Spring IOC容器与MyBatis SQL执行流程等框架机制,都是面试高频考点。通过系统化学习这些Java八股文核心内容,开发者能有效提升技术深度与面试 阅读详情

spring aop学习9:Aop的链式调用(责任链模式)

2017年10月30日 23:35:46 Tiglle 阅读数:1539 标签: springaop 更多

个人分类: Spring

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/Tiglle/article/details/78398734

一.责任链模式 
1.基本的责任链模式 
◆主体父类:abstract class Subject.java

package com.tiglle.responsibility.chain.model;
//主体
public abstract class Subject {

    private Subject successor;

    protected abstract void handle();

    public void execute(){
        handle();
        if(successor!=null){
            successor.execute();
        }
    }

    public Subject getSuccessor() {
        return successor;
    }

    public void setSuccessor(Subject successor) {
        this.successor = successor;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

◆子类和测试main方法:MainExec.java

package com.tiglle.responsibility.chain.model;

public class MainExec {

    private static class Part1 extends Subject{
        @Override
        protected void handle() {
            System.out.println("Part1的handle");
        }
    }
    private static class Part2 extends Subject{
        @Override
        protected void handle() {
            System.out.println("Part2的handle");
        }
    }
    private static class Part3 extends Subject{
        @Override
        protected void handle() {
            System.out.println("Part3的handle");
        }
    }


    public static void main(String[] args) {
        Part1 part1 = new Part1();
        Part2 part2 = new Part2();
        Part3 part3 = new Part3();

        part1.setSuccessor(part2);
        part2.setSuccessor(part3);

        part1.execute();
    }

}

执行结果:
Part1的handle
Part2的handle
Part3的handle
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

原理: 
执行Part1继承自父类的execute()方法,首先执行Part1重写了父类抽象方法handle(),然后判断successor(此时successor为Part2)是否为null

此时successor(Part2)不为null,执行Part2的execute,首先执行Part2重写了父类抽象方法handle(),然后判断successor(此时successor为Part3)是否为null

此时successor(Part3)不为null,执行Part3的execute,首先执行Part3重写了父类抽象方法handle(),然后判断successor(Part3的successor为null)是否为null,为null,停止执行

2.优化的责任链模式 
◆主体父类:abstract class Subject.java

package com.tiglle.responsibility.chain.model.optimization;

public abstract class Subject {

    protected abstract void handle();

    public void execute(SubjectChain successor){
        handle();
        successor.process();
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

◆中间类:class SubjectChain.java

package com.tiglle.responsibility.chain.model.optimization;

import java.util.List;

public class SubjectChain {

    private List<Subject> successors;

    public SubjectChain(List<Subject> successors){
        this.successors = successors;
    }

    private int index = 0;

    public void process(){
        if(index < successors.size()){
            successors.get(index++).execute(this);
        }
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

◆测试main方法:MainExec.java

package com.tiglle.responsibility.chain.model.optimization;

import java.util.ArrayList;
import java.util.List;

public class MainExec {

    private static class Part1 extends Subject{
        @Override
        protected void handle() {
            System.out.println("Part1的handle");
        }
    }

    private static class Part2 extends Subject{
        @Override
        protected void handle() {
            System.out.println("Part2的handle");
        }
    }

    private static class Part3 extends Subject{
        @Override
        protected void handle() {
            System.out.println("Part3的handle");
        }
    }

    public static void main(String[] args) {
        Part1 part1 = new Part1();
        Part2 part2 = new Part2();
        Part3 part3 = new Part3();
        List<Subject> successors = new ArrayList<>();
        successors.add(part1);
        successors.add(part2);
        successors.add(part3);

        SubjectChain subjectChain = new SubjectChain(successors);
        subjectChain.process();
    }
}


执行结果:
Part1的handle
Part2的handle
Part3的handle

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

原理:两个方法的互相调用,并设置中断条件

二.spring aop的链式调用使用的第二种方法: 
源码:

@Override
    public Object proceed() throws Throwable {
        //  We start with an index of -1 and increment early.
        //从-1开始每次加1
        if (this.currentInterceptorIndex == this.interceptorsAndDynamicMethodMatchers.size() - 1) {
            return invokeJoinpoint();
        }

        Object interceptorOrInterceptionAdvice =
                this.interceptorsAndDynamicMethodMatchers.get(++this.currentInterceptorIndex);
        if (interceptorOrInterceptionAdvice instanceof InterceptorAndDynamicMethodMatcher) {
            // Evaluate dynamic method matcher here: static part will already have
            // been evaluated and found to match.
            InterceptorAndDynamicMethodMatcher dm =
                    (InterceptorAndDynamicMethodMatcher) interceptorOrInterceptionAdvice;
            //
            if (dm.methodMatcher.matches(this.method, this.targetClass, this.arguments)) {
                return dm.interceptor.invoke(this);
            }else {
                // Dynamic matching failed.
                // Skip this interceptor and invoke the next in the chain.
                return proceed();
            }
        }else {
            // It's an interceptor, so we just invoke it: The pointcut will have
            // been evaluated statically before this object was constructed.
            return ((MethodInterceptor) interceptorOrInterceptionAdvice).invoke(this);
        }
    }
【信息科学与工程学】计算机科学与自动化——第一百三十五篇 开发框架篇 系列二 Spring框架系列 03 Spirng 01 编号机制/用法表现形式和配置编译器(底层实现·说明·缺陷·缺陷解决方案(含数学方程式描述与数学建模))引入版本国产化·信创·商用的CPU/GPU/ASIC/NP/DPU/其他硬件S1控制反转 (IoC)​ / 依赖注入 (DI)​- XML配置 () - Java注解 (, , ) - Java配置类 (, )底层实现: 反射 + 工厂模式 + 容器(Map)。 说明: 通过反射实例化Bean,解析依赖关系并注入。 缺陷: 运行时性能损耗(反射调用慢);循环依赖问题(构造器注入场景) 阅读详情

相关推荐

SpringAOP之探秘(动态代理、责任链模式、注解使用)

SpringAOP之探秘(动态代理、责任链模式、注解使用)- 详情:https://blog.youkuaiyun.com/Dream_Weave/article/details/85008674

Spring Aop 底层责任链思路实现

实现增强功能其实我们就是将输出语句的位置都换成想要实现的代码就可以了,可能看起来有些疑问 ,这和spring的AOP并不是完全像,那是因为 AOP 有部分是有ioc的参与的 但是很巧,我们之前实现过ioc如果这个系列更新的还好的话 之后可以尝试做个小型的Spring。和小冷一起读spring源码在去根据自己想想怎么用自己的思路去实现。那么这次的责任链动手实践 我们都学到了什么呢?责任链模式的应用递归的运用学习到类优秀框架源码的思路获得一个半成品的aopdemo。

doomwatcher的博客 2149

ur3手眼标定+realsenseL515

知乎 csdn

AI_future的博客 978

Spring源码之AOP(二)——代理的生成和链式调用

上文(链接地址:)我们详细讲到了找根据Advice和Pointcu找切面(Adviosr)的过程,现在,切面找到了,进入本章的主题,生成代理。

奔跑的蜗牛_Kieasr 898

使用RepeatModeler和RepeatMasker注释基因组重复序列

重复序列注释有两种常用策略,基于同源序列相似性和基于重复序列结构特征。RepeatMasker是基于同源序列相似性注释序列的常用工具, RepeatModeler可用来从头对基因组的重复序列家族进行建模注释,它的核心组件是RECON和RepatScout。 这篇教程介绍如何使用RepeatModeler从头鉴定基因组的重复序列,之后用RepeatMasker根据自...

xuzhougeng blog 8852

手把手教你用Cesium和RayMarching实现逼真体积云(附完整Shader代码)

本文详细介绍了如何利用Cesium和RayMarching技术实现逼真的体积云效果,包括环境准备、核心逻辑、云层建模和光照增强等关键步骤,并提供了完整的Shader代码。通过噪声函数选型、动态风场模拟和多重散射近似等技术,开发者可以在数字地球可视化项目中创建沉浸式天气效果,显著提升场景的真实感。

weixin_29230649的博客 415

链模式

链模式 链模式是一种链式调用的方式,准确来说不属于通常定义的设计模式范畴,但链式调用是一种非常有用的代码构建技巧。 描述 链式调用在JavaScript语言中很常见,如jQuery、Promise等,都是使用的链式调用,当我们在调用同一对象多次其属性或方法的时候,我们需要多次书写对象进行.或()操作,链式调用是一种简化此过程的一种编码方式,使代码简洁、易读。 链式调用通常有以下几种实现方式,但是本质上相似,都是通过返回对象供之后进行调用。 this的作用域链,jQuery的实现方式,通常链式调用都是采用这

WindRunnerMax 1188

从BUCK-BOOST到反激:一个‘拆电感’的视角,轻松理解多路输出交叉调整

本文从BUCK-BOOST电路到反激变换器的演变入手,通过‘拆解电感’的独特视角解析多路输出交叉调整机制。深入探讨了反激电路的能量暂存方式、传递路径变化及电压关系,并结合具体参数对比揭示其特性。针对多路输出中的电压平衡问题,提供了绕组排布优化、元器件选型等实战技巧,帮助工程师有效提升电源系统的稳定性与效率。

weixin_33738578的博客 437

java 调用链模式,spring aop学习9:Aop的链式调用(责任链模式)

一.责任链模式1.基本的责任链模式◆主体父类:abstract class Subject.javapackage com.tiglle.responsibility.chain.model;//主体public abstract class Subject {private Subject successor;protected abstract void handle();public voi...

weixin_34014076的博客 774

102、栅极驱动芯片选型与设计

文章摘要 本文分享了栅极驱动芯片选型与设计的实战经验。通过一次因驱动芯片选型不当导致的炸管事故,作者总结了栅极驱动芯片选型的五个关键参数:峰值驱动电流、驱动电压范围、传播延迟匹配、欠压锁定和隔离等级。文章详细分析了自举电路设计中的常见陷阱,以及栅极电阻对开关特性的影响,并强调了PCB布局布线的重要性。最后,作者提供了七条实用建议,包括避免通用型驱动芯片、关注CMTI参数、使用插件电阻等。核心观点是:栅极驱动设计需要综合考虑参数匹配、电路布局和实际调试,示波器实测波形是验证设计的唯一标准。

2401_88858637的博客 44

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

Java 23 种设计模式:从踩坑到精通 | 责任链模式 —— 请求流转,审批流程的本质

摘要:当请求需要经过多个处理者,且处理链在运行时才能确定时,写死 if-else 链会让代码严重耦合、难以扩展。责任链模式通过将处理者串联成一条链,让请求沿着链自动传递,直到被某个处理者处理。本文从 OA 审批流程出发,完整讲解纯责任链与不纯责任链的实现,结合 Servlet Filter、Spring Interceptor 等框架应用,并给出 Spring 自动装配链的实战写法,帮你彻底掌握“请求传递,各司其职”的设计精髓。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 957

AIGC实战——变分自编码器(Variational Autoencoder, VAE)

变分自编码器通过在模型中引入随机性,并限制潜空间中的点的分布来解决自编码器存在的问题。只需进行一些微小的调整,就可以将自编码器转换为变分自编码器,从而使其成为真正的生成模型。在本节中,我们介绍了变分自编码器的基本原理,并使用 `Keras` 实现了一个变分自编码器用于生成 Fashion-MNIST 图像。

盼小辉丶的博客 1万+

Spring中的设计模式(11种)

Spring中的11种常见设计模式

jhgjyfgyu的博客 525

Python爬虫教程:抓取电商网站评论(以淘宝和京东为例)

通过本文的介绍,我们学会了如何使用Python编写爬虫,抓取淘宝和京东等电商平台的商品评论数据。我们介绍了如何使用电商平台提供的开放API以及如何通过模拟浏览器来抓取动态加载的数据。此外,我们还讨论了如何应对反爬虫技术,如何存储抓取的数据等。爬取电商平台的数据是一个强大的工具,能够为市场分析、消费者行为研究、产品优化等领域提供有力的支持。然而,在使用爬虫技术时,我们必须遵循法律法规,尊重平台的隐私政策,避免滥用数据。

2201_76125261的博客 1738

计算机控制技术及应用

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

Java 23 种设计模式:从踩坑到精通 —— 开篇及系列介绍

摘要:本文是《Java 23种设计模式:从踩坑到精通》系列的总入口与导航页。文章梳理了设计模式的起源与三大分类,结合SOLID六大原则,详解为什么2026年设计模式依然重要。提供25篇完整目录、面试高频Top10速记、场景速查索引、易混模式对比表及分级阅读路线,可作为长期收藏的设计模式学习手册。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 3581

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

2024年Java设计模式实战指南:从SOLID原则到Spring源码剖析

设计模式是面向对象编程中解决常见问题的经典方案,其核心在于提升代码的可复用性、可扩展性和可维护性。从原理层面看,设计模式基于SOLID等核心设计原则,通过封装变化、降低耦合来实现软件设计的灵活性。在技术价值上,掌握设计模式能帮助开发者深入理解主流框架底层机制,提升系统架构能力。尤其在微服务、云原生等现代架构中,设计模式的应用更为关键。本文以Spring框架为例,剖析了工厂模式在IoC容器、观察者模式在事件驱动、模板方法模式在JdbcTemplate中的具体实现,并结合电商支付、订单处理等实战场景,展示了策略

weixin_34082695的博客 411

深度学习工具包 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&#39;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(&#39;DeepLearnToolbox&#39;));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(&#39;state&#39;,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&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,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 = &#39;sigm&#39;;%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, &#39;Too big error&#39;);```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(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;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)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;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, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% 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&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 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, &#39;Too big error&#39;);```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(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,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, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % 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, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);%% 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(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % 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, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java高性能动态代理:Byte Buddy与FieldAccessor实战

动态代理是Java中实现AOP和运行时增强的核心技术,传统基于反射的方案存在显著性能瓶颈。通过字节码生成技术(如Byte Buddy)可以直接操作类文件结构,配合FieldAccessor的字段直接访问能力,能够绕过反射机制实现接近原生代码的执行效率。这种技术组合特别适用于中间件开发、高性能框架等场景,实测显示其吞吐量可达反射方案的5-8倍。在实现原理上,Byte Buddy通过DSL化的API简化了字节码操作,而FieldAccessor则采用类似Unsafe的底层机制直接读写字段值。典型应用包括轻量级A

weixin_30628077的博客 363

01:SpringAI

ai

weixin_43761434的博客 422

02-ChatClient对话模型完全指南

ChatClient是 Spring AI 1.0 引入的全新 Fluent API,用于构建和发送对话请求。它替代了旧版的ChatModel直接调用方式,提供了更优雅、更强大的编程体验。用户请求 → ChatClient.prompt() → [Advisor链] → LLM → ChatResponse → 业务层↑ 拦截/增强(记忆、安全、审计...)ChatClient 核心能力能力说明Fluent API链式调用,IDE 自动补全友好Advisor 集成内置责任链模式,拦截/增强请求和响应。

图灵传奇的博客 197

【Java 23种设计模式实战】

本文通过电商订单系统实战讲解Java 23种设计模式,告别传统"Hello World"式教学。文章首先指出常见代码问题(如违反开闭原则、单一职责),然后分类详解创建型(单例、工厂等)、行为型(策略、观察者等)、结构型(代理、装饰器等)模式在订单系统中的应用场景,每个模式都配有可运行的业务代码示例。特别强调模式解决的实际问题(如订单审批流使用责任链模式、支付方式切换使用策略模式),并对比不同实现方式的优缺点(如5种单例模式实现)。最后提供设计原则对照、易混淆模式对比及Spring框架中的设计模式应用。

weixin_50870268的博客 561

23个设计模式一文搞懂

本笔记涵盖 23 种经典设计模式,按创建型、结构型、行为型三大类整理。每个模式配有生活类比、核心思想、结构图解、实现要点、真实应用案例、适用场景、优缺点分析及常见面试题。

weixin_72753562的博客 802

《JAVA面经实录》- 23种设计模式面试题(二)

《JAVA设计模式面试精要》摘要:本文系统解析23种设计模式,分为创建型(单例、工厂等)、结构型(适配器、代理等)和行为型(观察者、策略等)三大类。重点阐述六大设计原则(SOLID+迪米特法则),每个模式均包含定义、原则应用、优缺点分析及典型业务场景(如电商支付、审批系统等),并附Java代码实现。特别强调模式选择需结合实际需求,避免过度设计,同时提供清晰的模式对比表格,帮助开发者快速掌握各模式核心特征与应用场景。

专注 Java 后端开发,分享基础语法、JVM、并发、Spring 全家桶、微服务、分布式、性能优化等实战干货。坚持输出高质量技术笔记,用简单语言讲清复杂原理,助力每一位 Java 开发者稳步进阶。 894

调用像链子,责任链模式

0x01:责任链模式简介 在责任链模式中,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上进行传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。责任链模式的UML类图如下: 其中,Handler是抽象处理者,定义了一个处理请求的接口;ConcreteHandler是具体处理者,处理它所负责的请求,可访问它的后继者,如果可处理该请求就处理,否则就将该请求转发给它的后继者。

happyhuangjinjin 799

这一次搞懂Spring代理创建+AOP链式调用过程

在上文创建代理对象的时候有这样一个方法://自定义MethodInterceptor.拿到setInterceptorNames方法注入的Interceptor对象= null) {else {i++) {//对自定义的advice要进行包装,把advice包装成advisor对象,切面对象这个方法的作用就在于我们可以扩展我们自己的Interceptor,首先通过方法获取到通过方法设置的Interceptor,然后调用方法将其包装为。

2401_83412285的博客 812
上一篇: 浅谈springMVC中的设计模式(1)——责任链模式
下一篇: 23种设计模式(19)java责任链模式
javaPie
博客等级 码龄16年 1171粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值