cglib动态代理、jdk动态代理及spring动态代理使用

1.项目初始化

1.1 pom.xml

<dependencies><!-- spring依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></dependency><!-- spring事务依赖 --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.2.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.2.5.RELEASE</version></dependency><!-- mybatis依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency><!-- mybatis和spring集成依赖 --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><!-- mysql驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency><!-- 阿里的连接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.12</version></dependency><!-- aspectj--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.5</version></dependency><dependency><groupId>org.apache.geronimo.bundles</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8_2</version></dependency></dependencies>

1.2UserService对象

package com.nq.service;import org.springframework.stereotype.Component;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:04*/
@Component
public class UserService {public void test(){System.out.println("test方法。");}public void a(){System.out.println("a方法。");}
}

在这里插入图片描述

2.cjlib动态代理的使用

2.1所有的方法都是使用动态代理

package com.nq.service;import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:29*/
public class CglibTest {public static void main(String[] args) {UserService target =new UserService();Enhancer enhancer=new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("before...");//被代理的对象,目标方法//Object result=methodProxy.invoke(target,objects);//Object result=method.invoke(target,objects);Object result=methodProxy.invokeSuper(o,objects);System.out.println("After...");return  result;}}});UserService userService = (UserService) enhancer.create();userService.test();}
}

2.2不同的方法使用不同的代理

package com.nq.service;import org.springframework.cglib.proxy.*;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:29*/
public class CglibTest {public static void main(String[] args) {UserService target =new UserService();Enhancer enhancer=new Enhancer();enhancer.setSuperclass(UserService.class);enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("before...");//被代理的对象,目标方法//Object result=methodProxy.invoke(target,objects);//Object result=method.invoke(target,objects);Object result=methodProxy.invokeSuper(o,objects);System.out.println("After...");return  result;}}, NoOp.INSTANCE});enhancer.setCallbackFilter(new CallbackFilter() {@Overridepublic int accept(Method method) {if("test".equals(method.getName())){//表示test方法执行第一个代理方法,其他方法执行第二个方法return 0;}else{return 1;}}});UserService userService = (UserService) enhancer.create();userService.a();}
}

3.jdk动态代理的使用

3.1UserInterface创建接口

package com.nq.service;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:58*/
public interface UserInterface {void test();void a();
}

3.2UserService实现接口

package com.nq.service;import org.springframework.stereotype.Component;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:04*/
@Component
public class UserService implements UserInterface{public void test(){System.out.println("test方法。");}public void a(){System.out.println("a方法。");}
}

3.3JdkTest代理的main方法

package com.nq.service;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:56*/
public class JdkTest {public static void main(String[] args) {UserInterface target=new UserService();UserInterface userInterface =(UserInterface) Proxy.newProxyInstance(JdkTest.class.getClassLoader(), new Class[]{UserInterface.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Jdk动态代理被执行了,方法之前");method.invoke(target,args);System.out.println("Jdk动态代理被执行了,方法之后");return null;}});userInterface.test();}
}

在这里插入图片描述

4.spring中动态代理的使用

4.1proxyFactory 动态代理的使用方法

NickelBeforeAdvice.java方法执行之前

package com.nq.advice;import org.springframework.aop.BeforeAdvice;
import org.springframework.aop.MethodBeforeAdvice;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 0:59*/
public class NickelBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] objects, Object o) throws Throwable {System.out.println("方法执行前被执行了");}
}

NickelAfterReturningAdvice.java方法执行之后

package com.nq.advice;import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.aop.AfterReturningAdvice;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 0:59*/
public class NickelAfterReturningAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {System.out.println("方法returning被执行了");}
}

NickelAroundadvice.java环绕方法

package com.nq.advice;import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;/*** @author Nickel* @version 1.0* @date 2023/7/30 0:59*/
public class NickelAroundadvice implements MethodInterceptor {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("方法执行round之前");Object proceed = invocation.proceed();System.out.println("方法执行round之后");return proceed;}
}

NickelThrowAdvice.java抛异常方法

package com.nq.advice;import org.springframework.aop.ThrowsAdvice;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 1:00*/
public class NickelThrowAdvice implements ThrowsAdvice {public void afterThrowing(Method method, Object[] args, Object target, NullPointerException ex) {System.out.println("方法抛异常执行了");}
}

UserService.java抛异常方法

package com.nq.service;import org.springframework.stereotype.Component;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:04*/
@Component
public class UserService implements UserInterface{public void test(){System.out.println("test方法。");}public void a(){System.out.println("a方法。");throw  new NullPointerException();}
}

SpringProxtFactoryTest.java测试方法

package com.nq.service;import com.nq.advice.NickelAfterReturningAdvice;
import com.nq.advice.NickelAroundadvice;
import com.nq.advice.NickelBeforeAdvice;
import com.nq.advice.NickelThrowAdvice;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 0:49*/
public class SpringProxtFactoryTest {public static void main(String[] args) {UserService target=new UserService();ProxyFactory proxyFactory=new ProxyFactory();proxyFactory.setTarget(target);//proxyFactory.setInterfaces(UserInterface.class);这里可以指定为接口类型proxyFactory.addAdvice(new NickelAroundadvice());proxyFactory.addAdvice(new NickelBeforeAdvice());UserService userService = (UserService) proxyFactory.getProxy();userService.test();}
}

在这里插入图片描述

4.2proxyFactory 对方法名字进行限制

NickelStaticMethodMatherPointcut.java方法匹配的方法

package com.nq.advice;import org.springframework.aop.support.StaticMethodMatcherPointcut;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 1:39*/
public class NickelStaticMethodMatherPointcut extends StaticMethodMatcherPointcut {@Overridepublic boolean matches(Method method, Class<?> aClass) {return method.getName().equals("test");}
}

NickelPointcutAdvisor.java切面方法

package com.nq.advice;import org.aopalliance.aop.Advice;
import org.springframework.aop.Pointcut;
import org.springframework.aop.PointcutAdvisor;
import org.springframework.aop.support.StaticMethodMatcherPointcut;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 1:34*/
public class NickelPointcutAdvisor implements PointcutAdvisor {@Overridepublic Pointcut getPointcut() {return new NickelStaticMethodMatherPointcut();}@Overridepublic Advice getAdvice() {return new NickelBeforeAdvice();}@Overridepublic boolean isPerInstance() {return false;}
}

SpringProxtFactoryTest.java测试的方法

package com.nq.service;import com.nq.advice.*;
import org.springframework.aop.MethodBeforeAdvice;
import org.springframework.aop.framework.ProxyFactory;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 0:49*/
public class SpringProxtFactoryTest {public static void main(String[] args) {UserService target=new UserService();ProxyFactory proxyFactory=new ProxyFactory();proxyFactory.setTarget(target);//proxyFactory.setInterfaces(UserInterface.class);这里可以指定为接口类型//proxyFactory.addAdvice(new NickelAroundadvice());//proxyFactory.addAdvice(new NickelBeforeAdvice());proxyFactory.addAdvisor(new NickelPointcutAdvisor());UserService userService = (UserService) proxyFactory.getProxy();userService.test();}
}

在这里插入图片描述
在这里插入图片描述

4.3spring中的动态代理方式

4.3.1spring执行方法时候启动逻辑

UserService.java修改

package com.nq.service;import org.springframework.stereotype.Component;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:04*/
public class UserService{public void test(){System.out.println("test方法。");}public void a(){System.out.println("a方法。");//throw  new NullPointerException();}
}

说明:这里需要去掉Component注解


AppConfig.java配置

package com.nq.service;import com.nq.advice.NickelAfterReturningAdvice;
import com.nq.advice.NickelBeforeAdvice;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;/*** @author Nickel* @version 1.0* @date 2023/7/28 14:59*/
@ComponentScan("com.nq")
public class AppConfig {@Beanpublic ProxyFactoryBean userService(){UserService userService=new UserService();ProxyFactoryBean proxyFactoryBean=new ProxyFactoryBean();proxyFactoryBean.addAdvice(new NickelAfterReturningAdvice());proxyFactoryBean.setTarget(userService);return proxyFactoryBean;}}

Test.java配置

package com.nq.service;import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:00*/public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();context.register(AppConfig.class);context.refresh();UserService userService = (UserService) context.getBean("userService");userService.test();}
}

启动Test.java显示结果
在这里插入图片描述

4.3.2不去掉注解,spring执行方法的时候执行对应的逻辑

修改NickelAfterReturningAdvice.Java,增加注解

package com.nq.advice;import org.aspectj.lang.annotation.AfterReturning;
import org.springframework.aop.AfterReturningAdvice;
import org.springframework.stereotype.Component;import java.lang.reflect.Method;/*** @author Nickel* @version 1.0* @date 2023/7/30 0:59*/
@Component
public class NickelAfterReturningAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {System.out.println("方法returning被执行了");}
}

修改UserService.Java,增加注解

package com.nq.service;import org.springframework.stereotype.Component;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:04*/
@Component
public class UserService{public void test(){System.out.println("test方法。");}public void a(){System.out.println("a方法。");//throw  new NullPointerException();}
}

修改AppConfig.Java配置文件

package com.nq.service;import com.nq.advice.NickelAfterReturningAdvice;
import com.nq.advice.NickelBeforeAdvice;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;/*** @author Nickel* @version 1.0* @date 2023/7/28 14:59*/
@ComponentScan("com.nq")
public class AppConfig {@Beanpublic BeanNameAutoProxyCreator beanNameAutoProxyCreator(){BeanNameAutoProxyCreator beanNameAutoProxyCreator=new BeanNameAutoProxyCreator();beanNameAutoProxyCreator.setBeanNames("userSe*");beanNameAutoProxyCreator.setInterceptorNames("nickelAfterReturningAdvice");beanNameAutoProxyCreator.setProxyTargetClass(true);return  beanNameAutoProxyCreator;}}

Test.Java配置文件

package com.nq.service;import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author Nickel* @version 1.0* @date 2023/7/29 23:00*/public class Test {public static void main(String[] args) {AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext();context.register(AppConfig.class);context.refresh();UserService userService = (UserService) context.getBean("userService");userService.test();}
}

Test测试结果
在这里插入图片描述

4.3.3AppConfig另外实现动态代理

package com.nq.service;import com.nq.advice.NickelAfterReturningAdvice;
import com.nq.advice.NickelBeforeAdvice;
import org.springframework.aop.framework.DefaultAdvisorChainFactory;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;/*** @author Nickel* @version 1.0* @date 2023/7/28 14:59*/
@ComponentScan("com.nq")
public class AppConfig {@Beanpublic DefaultPointcutAdvisor defaultPointcutAdvisor(){NameMatchMethodPointcut pointcut=new NameMatchMethodPointcut();pointcut.addMethodName("test");DefaultPointcutAdvisor defaultPointcutAdvisor=new DefaultPointcutAdvisor();defaultPointcutAdvisor.setPointcut(pointcut);defaultPointcutAdvisor.setAdvice(new NickelAfterReturningAdvice());return defaultPointcutAdvisor;}@Beanpublic DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator(){DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator=new DefaultAdvisorAutoProxyCreator();return defaultAdvisorAutoProxyCreator;}}

测试结果
在这里插入图片描述
其中DefaultAdvisorAutoProxyCreator通过导入的方式

package com.nq.service;import com.nq.advice.NickelAfterReturningAdvice;
import com.nq.advice.NickelBeforeAdvice;
import org.springframework.aop.framework.DefaultAdvisorChainFactory;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;/*** @author Nickel* @version 1.0* @date 2023/7/28 14:59*/
@ComponentScan("com.nq")
@Import(DefaultAdvisorAutoProxyCreator.class)
public class AppConfig {@Beanpublic DefaultPointcutAdvisor defaultPointcutAdvisor(){NameMatchMethodPointcut pointcut=new NameMatchMethodPointcut();pointcut.addMethodName("test");DefaultPointcutAdvisor defaultPointcutAdvisor=new DefaultPointcutAdvisor();defaultPointcutAdvisor.setPointcut(pointcut);defaultPointcutAdvisor.setAdvice(new NickelAfterReturningAdvice());return defaultPointcutAdvisor;}
}

在这里插入图片描述

4.4spring中Aspect的使用

创建NickelAspect.java

package com.nq.aspect;import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;/*** @author Nickel* @version 1.0* @date 2023/7/30 2:37*/
@Aspect
@Component
public class NickelAspect {@Before("execution(public void com.nq.service.UserService.test())")public void nickelBefore(JoinPoint joinPoint){System.out.println("NickelAspect执行了");}
}

修改AppConfig.java扫描类

package com.nq.service;import com.nq.advice.NickelAfterReturningAdvice;
import com.nq.advice.NickelBeforeAdvice;
import org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator;
import org.springframework.aop.framework.DefaultAdvisorChainFactory;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import org.springframework.aop.support.NameMatchMethodPointcut;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.context.annotation.Import;/*** @author Nickel* @version 1.0* @date 2023/7/28 14:59*/
@ComponentScan("com.nq")
@Import(AnnotationAwareAspectJAutoProxyCreator.class)
//@EnableAspectJAutoProxy
public class AppConfig {}

启动测试类测试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/15131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从源程序到可执行文件的四个过程

从源程序到可执行文件的四个过程 预处理编译汇编链接 程序要运行起来&#xff0c;必须要经过四个步骤&#xff1a;预处理、编译、汇编和链接&#xff0c;如下图所示&#xff1a; -E选项&#xff1a;提示编译器执行完预处理就停下来&#xff0c;后边的编译、汇编、链接就先不执…

kafka权威指南学习以及kafka生产配置

0、kafka常用命令 Kafka是一个分布式流处理平台&#xff0c;它具有高度可扩展性和容错性。以下是Kafka最新版本中常用的一些命令&#xff1a; 创建一个主题&#xff08;topic&#xff09;&#xff1a; bin/kafka-topics.sh --create --topic my-topic --partitions 3 --replic…

快速学会MyBatis映射关系一对一

文章目录 映射关系一对一映射关系-官方文档映射关系1对1-基本介绍基本介绍注意细节 映射关系1 对1-映射方式映射方式配置Mapper.xml 的方式方式1方式2 注解的方式实现应用实例总结 映射关系一对一 映射关系-官方文档 文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.…

GAMES101 笔记 Lecture13 光线追踪1

目录 Why Ray Tracing?(为什么需要光线追踪&#xff1f;)Basic Ray Tracing Algorithm(基础的光线追踪算法)Ray Casting(光线的投射)Generating Eye Rays(生成Eye Rays) Recursive(Whitted-Styled) Ray Tracing Ray-Surface Intersection(光线和平面的交点)Ray Rquation(射线方…

【Python数据分析】Python常用内置函数(二)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;二&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

WIZnet W5500-EVB-Pico 静态IP配置教程(二)

W5500是一款高性价比的 以太网芯片&#xff0c;其全球独一无二的全硬件TCP、IP协议栈专利技术&#xff0c;解决了嵌入式以太网的接入问题&#xff0c;简单易用&#xff0c;安全稳定&#xff0c;是物联网设备的首选解决方案。WIZnet提供完善的配套资料以及实时周到的技术支持服务…

小研究 - 一种复杂微服务系统异常行为分析与定位算法(二)

针对极端学生化偏差&#xff08;&#xff25;&#xff58;&#xff54;&#xff52;&#xff45;&#xff4d;&#xff45; &#xff33;&#xff54;&#xff55;&#xff44;&#xff45;&#xff4e;&#xff54;&#xff49;&#xff5a;&#xff45;&#xff44; &#…

Matlab Image Processing toolbox 下载安装方法

当安装好Matlab之后&#xff0c;发现没有Image Processing toolbox这个图像处理工具箱 从新安装一遍&#xff0c; 选上 Image Processing toolbox 但是不用选matlab即可 1.找到之前安装时的Setup安装程序包&#xff0c;按照之前安装Matlab步骤&#xff0c;到选择需要安装的Ma…

【CSS教程】农村小伙写出CSS完全教程帮助十万农村程序员就业迎娶白富美,出任CEO,登上人生巅峰

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录 网页内容位置内容分块装饰网页元素一次装饰多个网页元素用单独文件装饰网页保持网页各客户端一致改背景色设计网页布局以比例设计盒子布局让盒子在中间&#xff0c;设置边距设置样式的另一种方式设置网页图…

JVM基础篇-程序计数器

程序计数器 定义 Program Counter Register 程序计数器&#xff08;寄存器&#xff09; 作用:记住下一条jvm指令的执行地址特点 是线程私有的:每个线程都有自己的程序计数器不会存在内存溢出(规定) 作用 左侧:jvm指令 右侧:java代码 0: getstatic #20 // PrintSt…

【系统软件01】devtoolset离线安装gcc

【系统软件01】devtoolset离线安装gcc 一、SCL简介二、SCL源安装三、离线下载devtoolset1、Developer Toolset2、下载devtoolset-93、压缩devtoolset-9 三、离线安装devtoolset-9(gcc9.3)1、解压devtoolset-9.tar.gz2、安装devtoolset-9 四、设置环境变量(使用gcc9.3)1、当前窗…

DevOps-GitHub/GitLab

DevOps-GitHub/GitLab GitHub是一个开源代码托管平台。基于web的Git仓库&#xff0c;提供共有仓库和私有仓库&#xff08;私有仓库收费&#xff09;。 GitLab可以创建免费私有仓库。 GitHub 为了快速操作&#xff0c;这里对创建仓库以及注册不做说明。 首先再GitHub上创建一…

词典项目练习

思维导图 客户端 #include "head.h" //用户提示界面 void help_info1() {printf("\t-----------------------------------------------\n");printf("\t| HENRY 在线辞典 |\n");printf("\t|版本:0.0.1 …

华为开源自研AI框架昇思MindSpore应用案例:Vision Transformer图像分类

目录 一、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例 二、环境准备与数据读取三、模型解析Transformer基本原理Attention模块 Transformer EncoderViT模型的输入整体构建ViT 四、模型训练与推理模型训练模型验证模型推理 近些年&#xff0c;随着基于自注意&…

PP-Matting: AI高精度图像前景Matting,让抠图轻而易举

分割和Matting的一个重要区别是:分割返回的是像素分类标签,其结果是整型数据;而Matting返回的是属于前景或背景的概率P,从而在前景与背景交互区域产生渐变的效果,使得抠图更加自然。Matting分割模型训练完成后,对于原始图像每个位置上的像素,都将生成一个表示其前景透明…

创建维基WIKI百科和建立百度百科有何不同?

很多企业有出口业务&#xff0c;想在互联网上开展全球性网络营销&#xff0c;维基百科往往被认为是开展海外营销的第一站。其作用相当于开展国内网络营销的百度百科&#xff0c;经常有些企业给小马识途营销顾问提供的词条内容就是百度百科的内容&#xff0c;可事实上两个平台的…

ETHERNET/IP 转ETHERCAT连接倍福和欧姆龙PLC的配置方法

ETHERNET/IP和ETHERCAT是两种不同的协议&#xff0c;它们在工业生产中都有广泛的应用。然而&#xff0c;由于协议不同&#xff0c;这两种设备之间无法通讯&#xff0c;这给工业生产带来了很大的麻烦。而捷米JM-EIP-ECAT网关应运而生&#xff0c;它能够连接到ETHERNET/IP总线和E…

小研究 - JVM 垃圾回收方式性能研究(一)

本文从几种JVM垃圾回收方式及原理出发&#xff0c;研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响&#xff0c;并通过最终测试数据对比&#xff0c;给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…

【数据结构】栈(Stack)的实现 -- 详解

一、栈的概念及结构 1、概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在表尾进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出 LIFO&#xff08;Last In First Out&#xff09;的原则。 压栈…

SpringBoot的pom文件、容器、组件

一、pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4…