Spring核心之Aop

怎样自己亲手搭建一个四比特加法器 如何用三极管搭建一个四比特加法器 一、前言 作为大一上学期第一个大作业,最终还是拖到了冬学期的第八周,从第七周的周六开始,一直到第八周周五上午课上展示,中间连续熬了好几天的夜,另外,白天凡是有时间都用在研究它了,最终大约是用了30个小时,完成了这个四比特加法器的“从零到一”。 最终,小组得分92,个人分数100(贡献比35%),也不枉自己投入的心血 二、器材 电阻 1 包(10kΩ×100,1kΩ×50) 三极管 1 包(9013×100,LED×6) 跳线 3 短 1.5 长 电源 1 个 USB 线 阅读详情

SpringAOP

1 Spring AOP相关概念

Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强

2.AOP的相关术语

Target(目标对象)

要被增强的对象,一般是业务逻辑类的对象。

Proxy(代理) 

一个类被 AOP 织入增强后,就产生一个结果代理类。 

 Aspect(切面)

表示增强的功能,就是一些代码完成的某个功能,非业务功能。是切入点和通知的结合。

Joinpoint(连接点) 

所谓连接点是指那些被拦截到的点。在Spring中,这些点指的是方法(一般是类中的业务方法)。因为Spring只支持方法类型的连接点。

Pointcut(切入点) 

切入点指声明的一个或多个连接点的集合。通过切入点指定一组方法。
被标记为 final 的方法是不能作为连接点与切入点的。因为最终的是不能被修改的,不能被增强的

Advice(通知/增强) 

所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。通知定义了增强代码切入到目标代码的时 间点,是目标方法执行之前执行,还是之后执行等。通知类型不同,切入时间不同。
通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。 切入点定义切入的位置,通知定义切入的时间。

Weaving(织入).

是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。
切面的三个关键因素:
1、切面的功能--切面能干啥
2、切面的执行位置--使用Pointcut表示切面执行的位置
3、切面的执行时间--使用Advice表示时间,在目标方法之前还是之后执行。

具体作用


Spring Aop:Spring中Aop底层基于动态代理实现的,目标对象如果有接口,自动使用jdk动态代理,如果目标对象没有接口,自动使用cglib

问题
1.什么是目标对象?

2.怎么找到目标对象需要增强(修改)的方法?

3.如何对要增强(修改)的方法进行处理?

aop几个概念?(重点)

1.什么是目标对象?

1)Target(目标对象):要被增强(修改)的方法的对象。企业中,一般以业务类的对象作为目标对象。

2.怎么找到目标对象需要增强(修改)的方法?

Joinpoint(连接点) 和Pointcut(切入点)

Joinpoint(连接点):指代需要增强(修改)的目标对象中的特定方法。

Pointcut(切入点):切入点就是表达式:用来找到对应的要增强(修改)的目标对象中的特定方法。

     *  :0或者多个字符
    ..  :在方法的形参列表中,表示参数任意,在包名后面,表示当前包及其子包
    Pointcut表达式格式:
    execution(访问权限 返回值类型 包名.类名.方法名(参数列表)异常类型)
    eg:
    execution(* com.lr.spring.lr.*.*(..));
    表示aop下面所有的类,所有的方法。
    (第一个*表示返回任意类型第二个*表示任意类,第二个*表示任意方法)
    execution(* com.lr.spring..*.*(..));
    表示spring包以及子包中的任意的类中的任意方法

3.如何对要增强(修改)的方法进行处理?

Advice(通知/增强)和Aspect(切面类)
Advice(通知/增强):指定处理方法的位置(Pointcut),具体处理方法
Aspect(切面类):Advice所在的类就是切面类.

代码加入注解

1.准备工作

1.在pom.xml中引入外部文件

<dependency>
//引入的文件
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>5.3.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.3.4</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>5.1.15.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.6</version>
    </dependency>

//原本的文件
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

2.配置文件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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描文件   -->
<context:component-scan base-package="com.lr.spring.service com.lr.spring.aop"></context:component-scan>
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
</beans>

2.service包

1.UserService接口

package com.lr.spring.service;

public interface UserService {
    void insertUser(String name);
    void updateUser(String name);
    void findUserById(int id);
    void deleteUserBuId(int id);
}

2.UserServiceImpl实现类(目标对象)

package com.lr.spring.service;
//目标对象
@Controller
public class UserServiceImpl implements UserService {
    @Override
    public void insertUser(String name) {
        System.out.println("插入操作");
    }

    @Override
    public void updateUser(String name) {
        System.out.println("修改操作");
    }

    @Override
    public void findUserById(int id) {
        System.out.println("查询操作");

    }

    @Override
    public void deleteUserBuId(int id) {
        System.out.println("删除操作");

    }
}

3.Aop包

AspectJ类 中常用的通知有5种类型:
1. 前置通知
2. 后置通知
3. 环绕通知
4. 异常通知
5. 最终通知

 

 1.前置通知:Aspect代码

package com.lr.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

//切面类(advice,pointcut)
@Component
@Aspect
public class MyAspect {
    @Before("execution(* com.lr.spring.service.*.*(..))")
    public void before(JoinPoint jp){//jp指代要处理的目标对象的方法
        System.out.println("前置通知:在目标对象方法执行之前执行:");
        System.out.println("拦截到要处理的方法的方法名字:");
        String name = jp.getSignature().getName();//要处理的方法名字
        System.out.println("方法名:"+name);
        System.out.println("拦截要处理的方法的参数:");
        Object[] args=jp.getArgs();
        for (Object arg : args) {
            System.out.println("参数:"+arg);
        }

    }
}

2.测试程序

 @Test
    public void test01() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserService userService = (UserServiceImpl) context.getBean("userServiceImpl");
        userService.insertUser("龙仁");
        System.out.println("...................");
        userService.findUserById(100);
        System.out.println("...................");
        userService.updateUser("龙傲天");
        System.out.println("...................");
        userService.deleteUserBuId(100);

    }

 3.后置通知:修改原码

修改源代码,给查询方法一个返回值

package com.lr.spring.service;

public interface UserService {
    void insertUser(String name);
    void updateUser(String name);
    String findUserById(int id);
    void deleteUserBuId(int id);
}






package com.lr.spring.service;

import org.springframework.stereotype.Controller;

//目标对象
@Controller
public class UserServiceImpl implements UserService {
    @Override
    public void insertUser(String name) {
        
        System.out.println("插入操作");
    }

    @Override
    public void updateUser(String name) {
        
        System.out.println("修改操作");
    }

    @Override
    public String findUserById(int id) {
        System.out.println("查询操作");
        return "张三";
    }

    @Override
    public void deleteUserBuId(int id) {
        System.out.println("删除操作");

    }
}

4.后置通知:Aspect代码

 //后置通知:目标对象方法执行介绍之后,执行后置通知(可以获得当前方法的返回值)
    @AfterReturning(value = "execution(* com.lr.spring.service.*.*(..))",returning = "result")
    public void AfterReturning(Object result){
        System.out.println("后置通知:获得目标对象方法的返回值");
        System.out.println(result);
    }

5.测试程序

@Test
    public void test02() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserService userService = (UserServiceImpl) context.getBean("userServiceImpl");
        userService.findUserById(100);

    }

 

 6. 异常通知:Aspect代码

//异常通知:只有当前对象方法出现异常,反之没有异常,不执行该通知
    @AfterThrowing(value = "execution(* com.lr.spring.service.*.*(..))",throwing ="ex")
    public void exception(JoinPoint joinPoint,Throwable ex){
        System.out.println(joinPoint.getSignature()+"方法抛出异常");
        System.out.println(ex.getMessage());
    }

7:修改实现类代码:加入空指针异常

@Override
    public String findUserById(int id) {
        System.out.println("查询操作");
        String str =null;
        str.indexOf(101);
        return "张三";
    }

8. 测试程序

    @Test
    public void test02() {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
        UserService userService = (UserServiceImpl) context.getBean("userServiceImpl");
        userService.findUserById(101);
    }

 

9.环绕通知 Aspect代码

    //环绕通知:在目标对象的方法执行前后执行(调用目标对象的方法执行)
    @Around("execution(* com.lr.spring.service.*.*(..))")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("环绕通知---------目标对象方法执行之前");
        //执行目标对象的方法
        Object result = proceedingJoinPoint.proceed();
        System.out.println("环绕通知---------目标对象方法执行指挥");
        return result;
    }

 

10.最终通知

 //最终通知
    @After(value = "execution(* com.lr.spring.service.*.*(..))")
    public void myAfter(){
        System.out.println("最终被执行");
    }

 

 执行顺序环绕——》前置——》后置——》最终——》环绕

 

注解方式实现AOP

开发阶段:关注核心业务和AOP代码
运行阶段:spring框架会在运行的时候将核心业务和AOP代码通过动态代理的方式编织在一起
代理方式的选择:是否实现了接口:有接口就选择JDK动态代理;没有就选择CGLIB动态代理。

 

 1.注解方法

package com.lr.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import org.w3c.dom.ls.LSOutput;

//切面类(advice,pointcut)
@Component
@Aspect
public class MyAspect {
    // 标记某一个注解
    @Pointcut("execution(* com.lr.spring.service.*.*(..))")
    private void pointcut(){ }
    //前置通知:在目标对象方法执行之前执行,拦截到要处理的方法的方法名字
    @Before("pointcut()")
    public void before(JoinPoint jp){//jp指代要处理的目标对象的方法
        System.out.println("前置通知:在目标对象方法执行之前执行:");
        System.out.println("拦截到要处理的方法的方法名字:");
        String name = jp.getSignature().getName();//要处理的方法名字
        System.out.println("方法名:"+name);
        System.out.println("拦截要处理的方法的参数:");
        Object[] args=jp.getArgs();
        for (Object arg : args) {
            System.out.println("参数:"+arg);
        }
    }
    //后置通知:目标对象方法执行介绍之后,执行后置通知(可以获得当前方法的返回值)
    @AfterReturning(value = "pointcut()",returning = "result")
    public void AfterReturning(Object result){
        System.out.println("后置通知:获得目标对象方法的返回值");
        System.out.println(result);
    }
    //异常通知:只有当前对象方法出现异常,反之没有异常,不执行该通知
    @AfterThrowing(value = "pointcut()",throwing ="ex")
    public void exception(JoinPoint joinPoint,Throwable ex){
        System.out.println(joinPoint.getSignature()+"方法抛出异常");
        System.out.println(ex.getMessage());
    }
    //环绕通知:在目标对象的方法执行前后执行(调用目标对象的方法执行)
    @Around("pointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("环绕通知---------目标对象方法执行之前");
        //执行目标对象的方法
        Object result = proceedingJoinPoint.proceed();
        System.out.println("环绕通知---------目标对象方法执行指挥");
        return result;
    }

    //最终通知
    @After(value = "execution(* com.lr.spring.service.*.*(..))")
    public void myAfter(){
        System.out.println("最终被执行");
    }
}

2.XML方式实现AOP  

package com.lr.spring.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//切面类(advice,pointcut)
@Component
@Aspect
public class MyAspect2 {//只要通知了

    public void before(JoinPoint jp){//jp指代要处理的目标对象的方法
        System.out.println("前置通知:在目标对象方法执行之前执行:");
    }

    public void AfterReturning(Object result){
        System.out.println("后置通知:获得目标对象方法的返回值");
        System.out.println(result);
    }

    public void exception(JoinPoint joinPoint,Throwable ex){
        System.out.println(joinPoint.getSignature()+"方法抛出异常");
        System.out.println(ex.getMessage());
    }

    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("环绕通知---------目标对象方法执行之前");
        //执行目标对象的方法
        Object result = proceedingJoinPoint.proceed();
        System.out.println("环绕通知---------目标对象方法执行指挥");
        return result;
    }

    public void myAfter(){
        System.out.println("最终被执行");
    }
}

 配置文件

<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 扫描文件   -->
<context:component-scan base-package="com.lr.spring.service com.lr.spring.aop"></context:component-scan>
    <aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
    <aop:config>
        <!--  切入点  -->
        <aop:pointcut id="t1" expression="execution(* com.lr.spring.service.*.insert*(..))"/>
        <aop:pointcut id="t2" expression="execution(* com.lr.spring.service.*.update*(..))"/>
        <aop:pointcut id="t3" expression="execution(* com.lr.spring.service.*.delete*(..))"/>
        <aop:pointcut id="t4" expression="execution(* com.lr.spring.service.*.find*(..))"/>
        <!--  切入点跟通知结合  -->
        <aop:aspect ref="myAspect2">
            <aop:before method="before" pointcut-ref="t1"></aop:before>
            <aop:before method="before" pointcut-ref="t4"></aop:before>
            <aop:after-returning method="AfterReturning" returning="result" pointcut-ref="t4"></aop:after-returning>
        </aop:aspect>
    </aop:config>
</beans>

 

 

openEuler在虚拟机的网络配置 ethernet0.virtualDev 可以配置成其他类型的虚拟网络适配器。常见的选项包括:vlance - 用于模拟 AMD PCnet32 LANCE 网络适配器,支持10Mbps。e1000 - 用于模拟 Intel E1000 千兆网络适配器,支持1Gbps。e1000e - 用于模拟更现代的 Intel E1000e 千兆网络适配器。vmxnet - 用于 VMware 的自定义网络适配器,性能更好但需要安装 VMware Tools。 阅读详情

相关推荐

ReportStudio入门教程(四十一) - 固定报表列宽

我们继续上一篇博客,让他看起来

什么是江湖? 3518

JoinPoint的用法

public void doBefore(JoinPoint jp) throws NoSuchMethodException { visitTime = new Date();//当前时间就是开始访问的时间 clazz = jp.getTarget().getClass(); //具体要访问的类 String methodName = jp.getSignature().getName(); //获取访问的方法的名称 Object[] a..

Rocky balboa 1791

[技术解析]4DGS:突破实时动态渲染的4D高斯溅射技术

本文深入解析了4DGS(4D Gaussian Splatting)技术,它通过引入时间维度,将静态的3D高斯溅射升级为动态的4D表示,实现了对复杂动态场景的高质量实时渲染。该技术利用时空联合编码器与高斯形变场网络,结合多分辨率编码与差分溅射渲染,在VR/AR、高帧率游戏等领域展现出突破性的应用潜力,兼顾了渲染速度与画面稳定性。

weixin_29218509的博客 411

切面Aspect中@target不起作用

1)调试源码中,对于mapper(mybatisplus继承了BaseMapper)的targetClass是Proxy,找不到@HistorySave,所以没有起作用。2)在普通的类上面,增加@HistorySave注解,运行中targetClass就是普通的类名,可以找到HistorySave,能执行切面的代码。背景:想在mapper(mybatisplus)的接口上做一个切面, 所有的insert,update,delete操作都保存下操作数据。结果:切面中代码没有执行,切面没起作用。

我是谁 365

VMFS数据存储(datastore)丢失后恢复步骤

vmfs datastore恢复步骤

jetliu05的博客 3267

一文搞懂STM32定时器翻转模式(产生多路频率、占空比的PWM)

(产生多路频率、占空比的PWM)

weixin_56688599的博客 7936

spring学习笔记

spring学习笔记 spring全家桶 spring,springmvc,spring boot,spring cloud spring:出现在2002年,解决了企业开发的难度,减轻了项目模块之间的管理,类和类之间的管理,帮助开发人员创建对象,管理对象之间的关系,spring核心技术ioc,aop。能实现模块之间,类之间的解耦合 sping配置 加入maven依赖 <dependency> <groupId>org.spingframework</groupId&g

qq_45841534的博客 225

香橙派OPi 6系列选型指南:RK3588与RK3588S开发板深度对比

开发板选型是嵌入式系统设计的关键环节,尤其在边缘计算和AI推理等场景中,芯片的差异直接影响硬件架构。瑞芯微RK3588及其精简版RK3588S是当前高端开发板的核心方案,两者在PCIe通道、显示输出和SATA支持上存在显著区别。理解这些原理,有助于工程师根据项目需求快速匹配产品。香橙派OPi 6系列基于这两款芯片,衍生出OPi 6、OPi 6 Pro与OPi 6 Max三种形态:紧凑型适合嵌入式门禁与AI盒子,Pro版凭借双屏异显和PCIe 3.0满足收银机与视频分析,Max的双2.5G网口和大内存则面向轻

weixin_29185167的博客 228

ABSA 中 target、aspect、category 等名词概念梳理

我认为 NLP 的 ABSA 一直以来对一些概念的定义是不统一的,容易混淆的词有 target、entity、aspect、aspect term、category,所以针对这些词在这里区分一下。 先给出一个例句,之后解释每个名词的时候都用该例句来举例。 例句:华为手机不错,拍照很惊艳,电池续航能力也不错,就是外观有点儿丑。 Entity:一个客观存在的东西。例如例句中的“华为手机”。(当然,也可以是比较抽象的概念,比如电视行业,虽然没有一个这样的客观存在的实体,但其实我们可以将其抽象成一个 Entit

wtfloser的博客 1068

Xilinx/AMD公司7系列FPGA的ISERDESE2仿真的”天坑”(附verilog的源码vivado仿真工程)

研究LVDS输出接口的ADC与7系列(ZYNQ)FPGA对接过程中,在Vivado中搭建了ISERDESE2的仿真工程,仿真结果ISERDESE2的并行输出口一直输出X或Z,这个坑之大,耗费了我数天的时间,可以称为“天坑”了。同步复位的要求肯定是高于异步复位的,古话说得好“两害相权取其轻”,所以,跟古话对着干就对了!就当RST是同步复位吧,最后经过反复验证,发现。开始怀疑复位信号是否高电平持续时间不够长?但是没有查到复位时间的要求 : - (

FPGA艺术家的博客 171

关于海康MVS软件显示速率低与1GB、相机丢包的设置优化

工控机主要应用与视觉检测!相机网线及工控机网口都是千兆的!设置完巨帧数和速度与双工(选择为全双工),显示速度低与1GB,不能够正常工作。C.LA-Properdes-Advanced-将RecerveBuffers更改为2048。E.LAN-属性-电源管理-取消选中允许计算机关闭此设备以保存电源。这种情况均为MVS设置不熟悉,可参照如下设置优化相应端口相机配置。D.局域网-属性-高级-将传输缓冲区更改为20484。B.LAN-属性-高级-将中断记录部分更改为执行。A.关闭采集控制帧速率控制。

米可的博客! 8827

讨论AspectJ之target、this、within关键字差异性

今天学习了一下AspectJ,查看了官方文档,查阅了很多其他技术博客,发现大部分人对关键字target、this、within之间差异不是特别清楚,所以引入本文来详细讨论它们之间的区别。特别介绍http://blog.youkuaiyun.com/zl3450341/article/details/7673979此文,本片验证思路来源于此并做了扩充说明。   1.首先,AspectJ官方怎么描述这三个关...

iteye_13712的博客 553

加权均值向量算法(INFO)详解:从数学原理到智能算法

本文系统介绍了加权均值向量算法(INFO)的理论基础、数学模型与实现应用。该算法基于加权均值数学概念,通过MeanRule规则平衡探索与开发能力,具有结构新颖、参数合理的特点。核心内容包括:1) 算法理论基础,阐述加权均值数学定义与小波函数权重计算;2) 算法原理,详细解析更新规则、向量组合和局部搜索三阶段数学模型;3) 实现方法,提供MATLAB代码关键参数解析;4) 改进方向,介绍INFO-KELM混合模型等变体;5) 应用案例,涵盖函数优化、工程设计与机器学习领域。

qq_42212808的博客 234

Spring AOP核心原理分析

摘要: Spring AOP通过面向切面编程思想,将通用功能(如日志、事务)与业务逻辑解耦,实现高内聚、低耦合。其核心原理基于动态代理技术,通过切面注解(如@Aspect、@Before)定义增强逻辑,并利用切入点表达式匹配目标方法。启动阶段解析配置并生成代理对象,调用阶段按顺序织入通知逻辑。手写简易AOP框架可深入理解代理生成、方法匹配和逻辑织入三大核心流程。Spring AOP与IoC容器深度集成,是AOP思想的高效实现。

2403_88625492的博客 1175

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

深度学习工具包 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 AOP 核心知识点详解

Spring AOP 核心知识点详解

YeeSum的博客,对技术充满好奇! 2123

Statistics and Machine Learning Toolbox

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

Spring Boot AOP 核心概念全面解析

     你也可以通过配置强制Spring使用CGLIB代理,即使目标类实现了接口, 通过理解动态代理的核心原理和 Spring 的实现机制,开可以更好地掌握 AOP 的底层运作方式

Broken_x的博客 887

Spring核心技术--AOP

Spring核心技术–AOP在OOP中, 模块化的单位是class, 在AOP中, 模块化的单位是aspect.Spring IoC容器并不直接与AOP模块耦合, AOP模块是作为一个中间件方案提供给IoC容器使用的.声明式事务管理就是AOP在Spring框架中的一个典型实现, 另外, 池化也是一个典型的应用.对于Spring AOP编程来说, 推荐使用能够完成需求功能的最小Advice种类进行实现

congyh的专栏 1572

Spring AOP的核心解析 && Spring AOP 与 AspectJ的核心区别

织入时机与方式Spring AOP基于动态代理(JDK Proxy 或 CGLIB),在运行时生成代理对象,仅支持方法级别的切面(Method Execution)。依赖 Spring 容器管理 Bean。// JDK 动态代理示例AspectJ通过编译时(ajc 编译器)、编译后(二进制织入)或加载时(LTW)直接修改字节码,支持字段、构造器、静态方法等更细粒度的连接点。代理对象生成Spring AOP 为每个目标对象创建代理类,增加运行时开销;

csdn_tom_168的博客 731

Spring AOP 核心机制深度解析

Spring AOP 是基于动态代理的核心机制,采用 JDK 动态代理和 CGLIB 两种实现方式。其核心架构包括代理创建器、切入点处理器、通知器等组件,通过解析切面、匹配目标方法、创建代理对象并执行拦截器链实现功能。Spring AOP 仅支持方法级别的切面,与 AspectJ 相比实现更轻量但功能有限,适用于 Spring 容器环境下的简单切面需求。

weixin_47242663的博客 649

Spring核心之AOP

文章目录SpringAOPSpring AOP相关概念AspectJ 对 AOP 的实现注解方式实现AOP SpringAOP Spring AOP相关概念 Spring的AOP实现底层就是对上面的动态代理的代码进行了封装,封装后我们只需要对需要关注的部分进行代码编写,并通过配置的方式完成指定目标的方法增强。 Target(目标对象) 要被增强的对象,一般是业务逻辑类的对象。 Proxy(代理) 一个类被 AOP 织入增强后,就产生一个结果代理类。 Aspect(切面) 表示增强的功能,就是一些

LLLlucky_boy的博客 602

Spring AOP核心概念

AOP核心概念 1、横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点 2、切面(aspect) 类是对物体特征的抽象,切面就是对横切关注点的抽象 3、连接点(joinpoint) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器 4、切入点(pointcut) 对连接...

蚂蚁小帅哥的专栏 1754

Spring之核心容器AOP

文章目录Spring之核心容器AOP一 AOP概念1 什么是AOP二 AOP底层原理1 AOP使用动态代理三 AOP相关术语简介1 连接点2 切入点3 通知4 切面四 AOP操作1 准备工作五 AspectJ注解操作AOP1 创建类2 创建增强类3 进行通知的配置4 配置不同类型的通知5 相同切入点抽取6 设置增强类优先级7 完全使用注解开发六 AspectJ配置文件操作AOP1 创建两个类2 在spring配置文件创建两个类对象3 在spring配置文件中配置切入点 Spring之核心容器AOP 一 AO

hcyxsh的博客 350

【Spring】Spring核心概念AOP

Spring核心概念AOP介绍以及入门案例,了解如何使用注解开发SpringAOP

jiliangjiyin的博客 349

Spring框架的核心特性是什么?(IoC、AOP)

Spring框架通过IoC和AOP两大核心特性,实现了企业级应用的高效开发与维护。IoC容器通过依赖注入解耦组件,而AOP通过动态代理统一处理横切关注点,二者结合显著提升了代码的可复用性和可扩展性。随着Spring Boot和Cloud等子项目的成熟,Spring已成为构建现代Java应用的基石。

破损的天堂鸟博客 905

Spring的核心,Ioc和aop

Spring是一个开源框架。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为J2EE应用程序开发提供集成的框架。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 1.I

Y__J___的博客 576

如何快速上手【Spring AOP】?核心应用实战(上篇)

哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。

2301_81073317的博客 5136

【Spring】两大核心基石 IoC和 AOP

本文深入解析了Spring框架的两大核心机制:IoC(控制反转)和AOP(面向切面编程)。IoC通过依赖注入将对象创建和管理权交给容器,推荐使用构造器注入方式。AOP则将横切关注点(如日志、事务)模块化为切面,通过动态代理实现非侵入式增强。文章详细介绍了二者的实现原理、关键术语和代码示例,并阐述了它们如何协同工作:IoC容器管理基础对象,AOP在此基础上进行功能增强,共同构建松耦合、易维护的企业级应用架构。

瘦到被风吹走的博客 1409
上一篇: Spring核心之代理模式
下一篇: spring整合jdbc
continueLR
博客等级 码龄6年 9粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值