Spring AOP(代理模式及实践)

Java面向切面编程(AOP)全面解析与实践指南 Aspect@Component// 定义切点:匹配service包下所有方法logger.info("开始执行: {}.{}()",try {logger.info("方法 {} 执行耗时: {}ms",// 定义自定义注解Class<?// 实现重试切面@Aspect@Componentdo {try {if (!throw e;attempts++;// 退避策略。 阅读详情

    为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。

为了阐述清楚Spring AOP,我们从将以下方面进

    (1).代理模式

    (2).静态代理原理及实践

    (3).动态代理原理及实践

    (4).spring AOP原理及实践

1. 代理模式

    代理模式:为其他对象提供一种代理以控制对这个对象的访问。这段话比较官方,但我更倾向于用自己的语言理解:比如A对象要做一件事情,在没有代理前,自己来做;在对 A 代理后,由 A 的代理类 B 来做。代理其实是在原实例前后加了一层处理,这也是 AOP 的初级轮廓。 

2.静态代理原理及实践

    静态代理模式:静态代理说白了,就是在程序运行前就已经存在代理类的字节码文件、代理类和原始类的关系在运行前就已经确定。废话不多说,我们看一下代码。为了方便阅读,博主把单独的 class 文件合并到接口中,读者可以直接复制代码运行:

// 接口
public interface IUserDao {
    void save();
    void find();
}
 
//目标对象
class UserDao implements IUserDao{
    @Override
    public void save() {
        System.out.println("模拟:保存用户!");
    }
    @Override
    public void find() {
        System.out.println("模拟:查询用户");
    }
}
 
/**
  * 静态代理
  * 特点:
  * 2. 目标对象必须要实现接口
  * 2. 代理对象,要实现与目标对象一样的接口
 */
class UserDaoProxy implements IUserDao{
 
    // 代理对象,需要维护一个目标对象
    private IUserDao target = new UserDao();
 
    @Override
    public void save() {
        System.out.println("代理操作: 开启事务...");
        target.save();   // 执行目标对象的方法
        System.out.println("代理操作:提交事务...");
    }
 
    @Override
    public void find() {
        target.find();
    }
}

测试:

public static void main(String[] args) {
    //代理对象
    IUserDao proxy = new UserDaoProxy();

    //执行代理方法
    proxy .save();
}

测试结果:

    代理操作: 开启事务...

    模拟: 保存用户!

    代理操作: 提交事务...

结论:

    静态代理虽然保证了业务类只需关注逻辑本身,代理对象的一个接口只服务于一种类型的对象。如果要代理的方法很多,势必要为每一种方法都进行代理。再者,如果增加一个方法,除了实现类需要实现这个方法外,所有的代理类也要实现此方法。增加了代码的维护成本。那么要如何解决呢?答案是使用动态代理。

3.动态代理原理及实践

动态代理模式:动态代理类的源码是在程序运行期间,通过 JVM 反射等机制动态生成。代理类和委托类的关系是运行时才确定的。实例如下:

// 接口
public interface IUserDao {
    void save();
    void find();
}
 
//目标对象
class UserDao implements IUserDao{
 
    @Override
    public void save() {
        System.out.println("模拟: 保存用户!");
    }
 
    @Override
    public void find() {
        System.out.println("查询");
    }
}
 
/**
 * 动态代理:
 * 代理工厂,给多个目标对象生成代理对象!
 *
 */
class ProxyFactory {
 
    // 接收一个目标对象
    private Object target;
 
    public ProxyFactory(Object target) {
        this.target = target;
    }
 
    // 返回对目标对象(target)代理后的对象(proxy)
    public Object getProxyInstance() {
        Object proxy = Proxy.newProxyInstance(
            target.getClass().getClassLoader(),  // 目标对象使用的类加载器
            target.getClass().getInterfaces(),   // 目标对象实现的所有接口
            new InvocationHandler() {            // 执行代理对象方法时候触发
 
                @Override
                public Object invoke(Object proxy, Method method, Object[] args)
                        throws Throwable {
 
                    // 获取当前执行的方法的方法名
                    String methodName = method.getName();
                    // 方法返回值
                    Object result = null;
                    if ("find".equals(methodName)) {
                        // 直接调用目标对象方法
                        result = method.invoke(target, args);
                    } else {
                        System.out.println("开启事务...");
                        // 执行目标对象方法
                        result = method.invoke(target, args);
                        System.out.println("提交事务...");
                    }
                    return result;
                }
            }
        );
        return proxy;
    }
}

测试:

public static void main(String[] args) {
	//创建目标对象
	IUserDao target = new UserDao();
	//代理对象
	IUserDao  proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
	System.out.println("代理对象:" + proxy.getClass());
	//执行代理对象的方法
	proxy.save();
}

测试结果:

    目标对象: class test.dynamicProxy.UserDao
    代理对象: class com.sun.proxy.$Proxy0
    开启事务...
    模拟: 保存用户!
    提交事务...

IUserDao proxy = (IUserDao)new ProxyFactory(target).getProxyInstance();

其实是 JDK 动态生成了一个类去实现接口,隐藏了这个过程:

class $jdkProxy implements IUserDao{}

使用 JDK 生成的动态代理的前提是目标类必须有实现的接口。但这里又引入一个问题,如果某个类没有实现接口,就不能使用 JDK 动态代理。所以 CGLIB 代理就是解决这个问题的。

CGLIB 是以动态生成的子类继承目标的方式实现,在运行期动态的在内存中构建一个子类,如下:

CGLIB 使用的前提是目标类不能为 final 修饰。因为 final 修饰的类不能被继承。

现在,我们可以看看 AOP 的定义:面向切面编程,核心原理是使用动态代理模式在方法执行前后或出现异常时加入相关逻辑。

通过定义和前面代码我们可以发现3点:

(1) AOP 是基于动态代理模式。

(2) AOP 是方法级别的。

(3) AOP 可以分离业务代码和关注点代码(重复代码),在执行业务代码时,动态的注入关注点代码。切面就是关注点代码形成的类。

4.Spring AOP

    前文提到 JDK 代理和 CGLIB 代理两种动态代理。优秀的 Spring 框架把两种方式在底层都集成了进去,我们无需担心自己去实现动态生成代理。那么,Spring是如何生成代理对象的?

(1) 创建容器对象的时候,根据切入点表达式拦截的类,生成代理对象。

(2) 如果目标对象有实现接口,使用 JDK 代理。如果目标对象没有实现接口,则使用 CGLIB 代理。然后从容器获取代理后的对象,在运行期植入“切面”类的方法。通过查看 Spring 源码,我们在 DefaultAopProxyFactory 类中,找到这样一段话。

package org.springframework.aop.framework;

import java.io.Serializable;
import java.lang.reflect.Proxy;
import org.springframework.aop.SpringProxy;

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
    public DefaultAopProxyFactory() {
    }

    public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        if(!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {
            return new JdkDynamicAopProxy(config);
        } else {
            Class<?> targetClass = config.getTargetClass();
            if(targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
            } else {
                return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass)?new ObjenesisCglibAopProxy(config):new JdkDynamicAopProxy(config));
            }
        }
    }

    private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {
        Class<?>[] ifcs = config.getProxiedInterfaces();
        return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);
    }
}

简单的从字面意思看出:如果有接口,则使用 JDK 代理,反之使用 CGLIB ,这刚好印证了前文所阐述的内容。Spring AOP 综合两种代理方式的使用前提有会如下结论:如果目标类没有实现接口,且 class 为 final 修饰的,则不能进行 Spring AOP 编程!

知道了原理,现在我们将自己手动实现 Spring 的 AOP:

public interface IUserDao {
    void save();
}
 
// 用于测试 CGLIB 动态代理
class OrderDao {
    public void save() {
        //int i =1/0; 用于测试异常通知
        System.out.println("保存订单...");
    }
}
 
//用于测试 JDK 动态代理
class UserDao implements IUserDao {
    public void save() {
        //int i =1/0; 用于测试异常通知
        System.out.println("保存用户...");
    }
}
 
//切面类
class TransactionAop {
 
    public void beginTransaction() {
        System.out.println("[前置通知]  开启事务..");
    }
 
    public void commit() {
        System.out.println("[后置通知] 提交事务..");
    }
 
    public void afterReturing() {
        System.out.println("[返回后通知]");
    }
 
    public void afterThrowing() {
        System.out.println("[异常通知]");
    }
 
    public void arroud(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("[环绕前:]");
        pjp.proceed(); // 执行目标方法
        System.out.println("[环绕后:]");
    }
}

Spring 的 XML 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    <!-- dao实例加入容器 -->
    <bean id="userDao" class="test.spring_aop_anno.UserDao"></bean>

    <!-- dao实例加入容器 -->
    <bean id="orderDao" class="test.spring_aop_anno.OrderDao"></bean>

    <!-- 实例化切面类 -->
    <bean id="transactionAop" class="test.spring_aop_anno.TransactionAop"></bean>

    <!-- Aop相关配置 -->
    <aop:config>
        <!-- 切入点表达式定义 -->
        <aop:pointcut expression="execution(* test.spring_aop_anno.*Dao.*(..))" id="transactionPointcut"/>
        <!-- 切面配置 -->
        <aop:aspect ref="transactionAop">
            <!-- 【环绕通知】 -->
            <aop:around method="arroud" pointcut-ref="transactionPointcut"/>
            <!-- 【前置通知】 在目标方法之前执行 -->
            <aop:before method="beginTransaction" pointcut-ref="transactionPointcut" />
            <!-- 【后置通知】 -->
            <aop:after method="commit" pointcut-ref="transactionPointcut"/>
            <!-- 【返回后通知】 -->
            <aop:after-returning method="afterReturing" pointcut-ref="transactionPointcut"/>
            <!-- 异常通知 -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="transactionPointcut"/>
        </aop:aspect>
    </aop:config>
</beans>

切入点表达式不在这里介绍。参考 Spring AOP 切入点表达式

代码的测试如下:

private ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml", getClass());

@Test
public void testProxy() throws Ecxeption {
	//springIOC容器中获取对象,测试spring中jdk中的动态代理方式
	IUserDao userDao = (IUserDao ) ac.getBean("userDao");
	System.out.println(userDao.getClass());
	userDao.save();
}

@Test
public void testCglib() throws Ecxeption {
	//springIOC容器中获取对象,测试spring中Cglib中的动态代理方式
	OrderDao orderDao = (OrderDao ) ac.getBean("orderDao");
	System.out.println(orderDao.getClass());
	orderDao.save();
}

测试结果:

    class com.sun.proxy.$Proxy7
    [环绕前: ]
    [前置通知]  开启事务..
    保存用户...
    [环绕后: ]
    [后置通知]  提交事务..
    [返回后通知]

到这里,我们已经全部介绍完Spring AOP。回到开篇的问题,我们拿它做什么?

(1) Spring声明式事务管理配置

(2) Controller层的参数校验

(3) 使用 Spring AOP 实现 MySQL 数据库读写分离案例分析

(4) 在执行方法前,判断是否具有权限

(5) 对部分函数的调用进行日志记录:监控部分重要函数,若抛出指定的异常,可以以短信或邮件方式通知相关人员。

(6) 信息过滤,页面转发等等功能

GSEA富集分析实战:从数据准备到结果解读的完整R代码指南 本文提供了一份完整的GSEA富集分析实战指南,涵盖从R环境准备、数据质量控制到基因ID转换、参数优化和结果解读的全流程。通过详细的R代码示例和实用技巧,帮助研究人员高效完成基因集富集分析,特别针对生物信息学中常见的GSEA分析痛点提供了专业解决方案。 阅读详情

相关推荐

人工智能-CS188 Project 2: Multi-agents

一、项目介绍 项目介绍网页 项目代码下载 本项目是采用Berkeley的CS188课程内容实习二的内容,在这个项目中,我们将为经典版本的Pacman 设计自动算法,包括幽灵。在此过程中,我们将实现 minimax 和 expectimax 搜索并尝试评估函数设计 完成作业只需要完成5个题目,按照项目介绍的步骤进行完成,主要是在multiAgents.py文件中进行补充代码 二、代码详情 1、Question1:Reflex Agent 略 2、Question2:Minimax 套用ppt上的minm

xiten的博客 8285

spring AOP的两种代理

本篇记录下spring AOP的两种代理,为下一篇AOP实现做下铺垫。 1.JDK动态代理 2.cglib代理 1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 注:JDK动态代理要比cglib代理执行...

weixin_30748995的博客 770

【图神经网络】从0到1使用PyG手把手创建异构图

异构图的准确定义如下:异构图(Heterogeneous Graphs):一个异构图GGG有一组节点V=v1,v2,...,vnV=v_1,v_2,...,v_nV=v1​,v2​,...,vn​和一组边E=e1,e2,...,emE=e_1,e_2,...,e_mE=e1​,e2​,...,em​组成,其中每个节点和每条边都对应着一种类型,用TvT_vTv​表示节点类型的集合,TeT_eTe​表示边类型的集合,一个异构图有两个映射函数,分别将每个节点映射到其对应的类型ϕv:V→Tv\phi_v:V\rig

小哲的博客 7833

AOP的底层实现-CGLIB动态代理和JDK动态代理

AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础。它是一种面向切面编程的思想。关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来讲解下AOP的核心功能的底层实现机制:如何用动态代理来实现切面拦截。 AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面...

836811384 1169

【Python爬虫】爬取企业专利信息

本来是个美好的周末的,但是周五晚上领导给了一个公司名称的Excel,让把这些公司的专利信息爬取下来。本文记录了爬取企业专利信息的心酸过程。码字不易,喜欢请点赞!!! 一、找寻目标网页 在接到这个任务之后,我的内心是拒绝的。但是又不能不干。因此首先我需要先找到有公司专利信息的地方。在一番查找和问了问朋友之后,我知道中国专利网、国家知识产权网、Incopat、天眼查、企查查这些网站上面都有企业的专利...

Asher117的博客 2万+

从二极管到CMOS:手把手教你搭建数字电路中的基础门电路(附原理图)

本文详细介绍了数字电路中基础门电路的搭建方法,从二极管门电路到现代CMOS门电路的设计与实现。通过原理图解析和实战案例,帮助读者掌握数字电路设计的核心知识,包括电平实现、门电路工作原理及实际调试技巧,适合电子技术爱好者和初学者学习参考。

weixin_29252171的博客 321

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程。AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录。AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中。 一、AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前、类初始化之后、...

bangci6459的博客 1353

docker安装fastdfs+nginx配置

docker安装fastdfs+nginx,实现图片或文件的上传与下载

weixin_47325126的博客 2193

Spring - 动态代理 与 AOP 理解

一.动态代理模式     (1)产生的代理对象和目标对象实现了共同的接口;(jdk动态代理)     JDK的动态代理 :   1. 用Jdk的API做到的;   2. 代理对象时动态产生的; 注意:             1. 拦截器中invoke方法体的内容就是代理对象方法体的内容;             2. 当客户端执行代理对象,方法的时候,进入到了拦截器的invoke的

原小明 1039

使用Gromacs进行蛋白和配体小分子的动力学模拟+结果分析全流程教程

先选protein,选择non-water,使用pymol打开delWater.pdb,输入util.ss('all')展示cartoon,点击file-Export Moive as-MPEG。这一步完成后,文件夹中会出现以下三个文件,其中gro 文件用于记录蛋白的初始坐标,top 文件记录蛋白的拓扑信息和力场信息,itp 与top文件类似。接下来使用Spdbv软件打开蛋白,如果蛋白中存在原子缺失情况,就会出现以下的提示,如果不存在就不会显示,同时保存为rep.pdb。

weixin_46587777的博客 2854

手把手教你学PCIE(2.1.8)--pcie基本概念流量控制(Flow Control, FC)

PCIe 的流量控制(Flow Control, FC)是确保数据传输可靠性和高效性的关键技术。通过信用值管理,发送方和接收方可以动态调整数据传输速率,避免数据丢失和溢出。理解流量控制的工作原理和实现机制对于开发和调试 PCIe 系统非常重要。希望这个介绍能帮助你更好地理解和使用 PCIe 流量控制。

MHD0815的博客 1808

aop的底层实现,动态代理是如何动态,假如有100个对象,如何动态的为这100个对象代理

AOP:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 AOP应用范围 日志记录,跟踪,优化和监控,事务的处理,持久化,如数据库连接池的管理,系统统一的认证、权限管理等. AOP的实现 AOP实现可以分为两种: 1.静态织入(AspectJ) 在代码的编译阶段植入Pointcut的内容 ,优点是性能好 2.动态代理(Spring) 在代码执行阶段,在内存中截获对象,动态的插入Pointcut的内容,优点是不需要额外的

wlg9527的博客 975

VMware下载与安装

一、VMware下载 二、VMware安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 315

Java代理模式深度解析:从静态代理到动态代理(JDK/CGLIB)与Spring AOP实践

代理模式是面向对象编程中一种重要的结构型设计模式,其核心原理是为其他对象提供一个代理或占位符,以控制对该对象的访问。这一机制允许在不修改原始对象代码的前提下,实现对目标方法的增强,如日志记录、性能监控、事务管理和安全检查等横切关注点的集中处理。从技术价值看,代理模式有效解决了代码重复和职责混乱问题,提升了系统的可维护性和扩展性。在Java生态中,代理模式主要有静态代理和动态代理两种实现方式,其中动态代理又分为基于接口的JDK动态代理和基于继承的CGLIB动态代理。这些技术广泛应用于企业级开发框架中,特别是S

weixin_33674976的博客 468

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

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

代理模式与动态代理详解:从Java实现到Spring AOP的落地实践

在面向对象设计中,结构型模式常被用于解耦调用方与实现细节,而代理模式正是其中最典型的代表之一。它通过引入一个中间层,在不修改目标代码的前提下,对方法调用进行增强、拦截或延迟处理。Java生态中,JDK动态代理基于接口在运行时生成代理类,CGLIB则通过继承目标类实现代理,二者共同构成了Spring AOP、事务管理、懒加载、远程调用等核心机制的技术底座。理解静态代理、动态代理及二者选型,有助于从源码层面把握框架运行原理,规避事务失效、代理转换异常、对象哈希错乱等常见工程陷阱。无论是传统权限控制、缓存增强,还

weixin_30225755的博客 261

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

代理模式详解:五种类型、选型依据与Spring AOP落地实践

在Java工程实践中,设计模式常被用来解决横切逻辑与访问控制等基础问题。代理模式作为其中一类核心模式,通过引入间接层,在不修改真实对象代码的前提下,实现对目标对象访问的控制与增强。理解其角色划分与运行原理,是掌握动态代理、静态代理、保护代理、虚代理及远程代理的关键前提。代理模式在技术框架中价值突出,例如Spring AOP就依赖动态代理机制统一处理事务、日志与权限校验,使得业务代码保持干净可维护。实际选型时,需结合接口数量、变化频率与控制目标判断,避免盲目追求动态代理。本文系统梳理代理模式的本质、五种常见类

weixin_33600816的博客 307

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring框架(AOP)②

????Spring-AOP切面编程 AOP:面向切面编程,底层是代理模式 OOP:面向对象编程 目录 一、代理模式     ①、静态代理     ②、动态代理代理 二、AOP切面编程     ①、AOP基本概念     ②、切面编程的两种方式 一、代理模式 代理其实就是对原有代码不进行修改,进行功能的增加。 静态代理 动态代理 ①、静态

每日小新 312

spring AOP是什么?你都拿它做什么?

spring AOP是什么?你都拿它做什么?          对于最近博主最近写博客的兴致大发,我也在思考:为什么而写博客?在互联网时代,无论你是牛人大咖,还是小白菜鸟,都有发表自己看法的权利。无论你是对的还是错的,都会在这个平台

benhuo931115的博客 1424

Spring AOP是什么?你都拿它做什么?

点击上方“Java团长”,选择“置顶公众号”干货文章第一时间送达!由浅入深手把手带你搞定Spring AOP。上一篇文章中,我对Spring源码进行了分析讨论,此处不再赘...

Java团长 2万+

Spring代理模式及AOP

文章目录 前言 一、动态代理 二、AOP 1.相关概念及意义: 2.使用Spring实现AOP 前言 用于记录Spring学习过程中对动态代理及AOP相关知识的理解 提示:以下是本篇文章正文内容,下面案例可供参考 一、动态代理 动态代理和静态代理角色一样 动态代理的代理类是动态生成的,不是我们直接写好的 动态代理分为两大类:基于接口的动态代理,基于类的动态代理 基于接口——JOK动态代理 基于类——cglib 代理模式的好处: 可以使真实角色的操作更加纯粹!不用去...

qq_50709603的博客 252

深入理解Spring AOP与AspectJ:核心概念、实现与最佳实践

在软件开发过程中,横切关注点的管理对于提升代码的可维护性和可读性至关重要。Spring AOP(面向切面编程)和AspectJ提供了一套强大的工具来解决这些问题。本文将详细探讨Spring AOP与AspectJ的核心概念、实现细节、设计技巧以及最佳实践。

IT技术学习与工作笔记分享 637

深入源码解读Spring AOP设计思想:代理模式的应用场景

设计思想的核心:通过代理模式实现逻辑解耦,提升代码复用性和可维护性。技术选型建议优先使用JDK动态代理(目标对象实现接口时)。对于无接口的类,选择CGLIB动态代理。性能优化:减少不必要的切面,避免过度使用Around通知。源码调试技巧:通过的方法跟踪代理生成过程,结合Advisor和Pointcut的配置理解逻辑织入机制。通过深入源码分析,Spring AOP的设计充分体现了代理模式在解耦横切关注点中的价值,其灵活性和扩展性使其成为企业级应用开发的核心工具之一。

m0_73762612的博客 499

Spring Boot中的代理模式:揭秘AOP背后的核心魔法

你是否好奇Spring Boot如何实现无侵入式的日志、事务和安全控制?本文将揭开代理模式的神秘面纱,展示其如何成为Spring生态的"隐形引擎"!

专注分享原创技术干货。大厂资深架构师,多年技术架构与技术管理经验,多年面试官经验。一对一技术指导培训,带你从小白到入门到架构设计到技术管理。关注我,免费领取学习资料。一对一免费面试指导,快速拿offer。 1189

Spring AOP是什么?它能够做什么?

为什么会有面向切面编程(AOP)?我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。 为了阐述清楚Spring AOP,我们从将以下方面进行讨论: 代理模式 静态代理原理及实践 动...

weixin_38572549的博客 227

Spring AOP 是什么? 你都拿它做什么?

戳上方蓝字 “程序猿杂货铺”关注我!你的关注意义重大!原文|http://t.cn/E6H8ydE编辑 | 程序猿杂货铺阅读文本大概需要15分钟。为什么会有面向...

程序猿杂货铺 381
下一篇: Spring IOC (自动装配,依赖注入)
一尾鲫鱼
博客等级 码龄9年 7粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值