当前位置: 首页 > news >正文

Java - Spring框架 (ios+aop)

Spring

简介

Spring框架是为了解决企业应用开发的复杂性,使用基本的JavaBean代替EJB,并提供了更多的企业应用功能,Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架。

Spring优点

  • Spring是一个开源的免费的框架(容器)

  • Spring是一个轻量级的、非入寝式的框架

  • 控制反转(IOC)、面向切面编程(AOP)

  • 支持事务的处理,对框架整合的支持

总的来说,Spring是一个轻量级的控制反转和面向切面编程的框架

Spring框架模块划分

  • Core-Container

    • 这是Spring运行的核心,主要包括IoC Container, Events, Resources, i18n, Validation, Data Binding, Type Conversion, SpEL, AOP等内容。

  • Testing

    • 这是Spring中非常重要的一个模块,主要包括Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient等内容。

  • Data Access

    • 这是对数据库的访问相关,包括Transactions, DAO Support, JDBC, O/R Mapping, XML Marshalling等内容。

  • Web Servlet

    • 传统的对Web Servlet的支持,包括Spring MVC, WebSocket, SockJS, STOMP Messaging等内容。

  • Web Reactive

    • 这是Spring5新增的对于响应式系统的支持,包括Spring WebFlux, WebClient, WebSocket等。

  • Integration

    • 这是对第三方系统的支持,包括Remoting, JMS, JCA, JMX, Email, Tasks, Scheduling, Caching等常用的第三方系统。

  • Languages

    • 这是对其他JVM语言的支持,包括Kotlin, Groovy等动态语言。

Core核心技术

  • IOC:控制反转,依赖注入

  • AOP:面向切面编程

  • Events:
    • Spring事件处理机制,包括事件类ApplicationEvent和事件监听类ApplicationListener。

    • 如果实现了Application Listener接口的bean部署到Spring容器中,则每次ApplicationEvent发布到

  • ApplicationContext:都会通知该bean。

  • i18n:国际化,多语言

  • Validation:数据校验

  • Data Binding: 数据绑定

  • Type Conversion:类型转换,SpringMVC中参数的接收就使用到了

  • SpEL:
    • SpEL的全称叫做Spring Expression Language。通常是为了在XML或者注解里面方便求值用的,通过编写##{ }这样的格式,即可使用

IOC

简介

Spring的核心就是提供了一个IOC容器,它可以管理所有轻量级的JavaBean组件,提供的底层服务包括组件的生命周期管理、配置和组装服务、AOP支持,以及建立在AOP基础上的声明式事务服务等。
如果一个系统有大量的组件,其生命周期和相互之间的依赖关系如果由组件自身来维护,不但大大增加了系统的复杂度,而且会导致组件之间极为紧密的耦合,继而给测试和维护带来了极大的困难。
IOC容器解决了将组件的创建+配置与组件的使用相分离,实现对象之间的”解耦“。并且,由IOC负责管理组件的生命周期。
一个类中的方法、字段的值,可以通过外部注入的方式获得,不需要自己本身进行创建和推导。这个外部就是IOC容器。所谓的IOC,就是对象由Spring来创建、管理、装配!

什么是控制反转:

  • 传统应用程序的对象是由程序本身控制创建的;

  • 使用Spring后,对象是由Spring来创建的。

  • 程序本身不创建对象,而变成被动的接收对象。

IOC创建对象的方式

  1. 使用无参构造创建对象,默认!

  2. 使用有参构造器构建对象,3种(下标赋值,类型,参数名)

Spring配置(自己配置的xml)

  • Bean(对象)

    <bean id="user" class="org.example.U.User1"><constructor-arg name="name" value="olderhard" > </constructor-arg></bean><bean id="user1" class="org.example.U.User2" name="asdf,us">
<!--    <property name="name" value="adsf"> </property>--></bean>
  • alias(别名)
    • 一个对象的另一个名字

<alias name="user" alias="oasdf"></alias>
  • import
    • 一般用于团队开发使用,它可以将多个配置文件,导入合并为一个配置文件

DI(依赖注入)

依赖:bean对象的创建依赖于容器

注入:bean对象的所有属性,由容器来注入

  1. 构造器注入

  2. Set方式注入

  3. 拓展方式注入

  • c命名空间、p命名空间,通过这俩可以在配置Bean时,导入一些约束

<?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:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd">
<!--    p命名空间注入,可以直接注入属性的值--><bean id="use" class="com.old.User" p:name="older" p:age="20"> </bean>
</beans>

Bean的作用域

单例模型(默认)

scope="singleton"

原型模式(每次取出都是新的对象)

scope="prototype"

其余

request、session、application,这些只能在web开发中使用到

Bean的自动装配

Spring会在上下文中自动寻找,并自动给bean装配属性。

在Spring中有三种装配的方式
  1. 在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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="address" class="com.old.Address"><property name="name" value="asdffsad.com"> </property></bean><bean id="student1" class="com.old.Student"><!--        普通值注入--><property name="name" value="olderhard"> </property><!--        引用类型(Bean) 注入--><property name="address" ref="address"> </property><!--        数组注入--><property name="books"><array><value>红楼梦</value><value>西游记</value><value>水浒传</value><value>金瓶梅</value></array></property><!--        List注入--><property name="hobbys"><list><value>骑行</value><value>听歌</value><value>敲代码</value></list></property><!--        Map注入--><property name="card"><map><entry key="西游记" value="吴承恩"> </entry><entry key="三国演义" value="罗贯中"> </entry></map></property><!--        Set注入--><property name="games"><set><value>apex</value><value>三国杀</value></set></property><!--        null注入--><property name="wife"><null> </null></property><!--        Properties注入--><property name="info"><props><prop key="学号">12345678</prop><prop key="班级">计科2204</prop><prop key="性别">男</prop><prop key="username">olderhard</prop><prop key="password">12345678</prop></props></property></bean></beans>
  1. 在java中显式配置

@Configuration
public class Config {@Beanpublic User getUser(){return new User();}
}
@Component
public class User {private String name;public String getName() {return name;}@Value("tiantiantian")public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}
}
  1. 隐式的自动装配bean

  • byName:会自动在容器的上下文中寻找,和自己对象set方法后面的值对应的bean id,但要保证id全局唯一,并且id与set方法中的值一致。

  • byType:会自动在容器的上下文中寻找,和自己对象set方法后面的参数类型相对应的bean id,但要保证那个参数类型全局唯一,并且bean和set方法的类型一样。

<!--    byName:会自动在容器的上下文中寻找,和自己对象set方法后面的值对应的bean id--><bean id="person" class="org.example.person" autowire="byName"><property name="name" value="hujin"> </property></bean>

使用注解实现自动装配

使用注解须知
  1. 导入约束:context约束

<context:annotation-config/>
  1. 配置注解的支持:

<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd"><context:annotation-config/>
</beans>

常用注解

  • @Autowired 直接在属性上用即可,也可以在set方法上使用。

    • 使用Autowired我们可以不用编写set方法,前提是你这个自动配置的属性在IOC容器中存在,且符合byname!

    • @Autowired(required==false) 如果显示定义了required为false,说明这个对象可以为null,否则不能为null
      • @Autowired+@Qualifier(value="person"),这两个搭配使用,这样就是通过byName的方式实现的

  • @nullable 字段标记了这个注解,说明这个字段可以为null

  • @Resource:自动给字段装配,装配顺序:id,类型。

  • @Component:组件,放在类上,说明这个类被Spring管理了,就是bean,相应对象的名字就是首字母小写的这个类名。

  • @Scope("singleton")标注一个类是单例模式。

// 等价于在xml中注入Bean对象 <bean id="cat" class="org.example.Cat"/>
@Component
public class Cat {public void shout(){System.out.println("miao~~");}
}
注解说明:

@Autowired和@Resource

  • 都是用来自动装配的,都可以放在属性字段上

  • @Autowired通过byType的方式实现,并且要求这个对象存在!(可以通过required=false调整)

  • @Resource 默认通过byname的方式实现,如果找不到名字,则通过byType实现。但是如果两个都找不到的情况下,会报错。

@Component衍生注解

  • 我们在web开发中,会按照mvc三层架构分层。

  • dao,【@Repository】

  • service,【@Service】

  • controller,【@Controller】

@Component,@Repository,@Service,@Controller,这四个注解功能都是一样的,都是代表将某个类注册到Spring中,装配Bean。

xml与注解

  • xml更万能,适用于任何场合!维护非常方便

  • 注解 不是自己的类使用不了,维护相对复杂,

  • 最佳实践:xml管理bean,注解自负责完成属性的注入。

  • 我们在使用的过程中,只需要注意一个问题:必须让注解生效,就需要开启注解的支持。

<context:component-scan base-package="org.example"> </context:component-scan>
<context:annotation-config/>
  • 完全不需要配置文件,使用Java的方式配置Spring
    • JavaConfig是Spring的子项目,在Spring4之后,它变成了核心功能。

    • @Configuration,这个所注释的类会被托管到Spring容器,注册到容器中,因为它本来就是一个@Component,@Configuration代表这是一个配置类,就和我们之前看到的beans.xml是一样的。

    • 注册一个bean,就相当于我们之前写的一个bean标签,这个方法的名字就相当于bean标签中的id,这个方法的返回值就相当于bean标签中的class属性

@Configuration
public class Config {@Beanpublic User getUser(){return new User();}
}

AOP

简介

AOP,面向切面编程,面向切面编程是一种编程范式,旨在通过分离横切关注点来提高软件模块化程度。横切关注点是指那些跨越多个模块的功能,例如日志记录、安全性、事务管理等。

AOP中的概念

  • 切面:
    • 就是每个模块中都有一个相似的操作,而这个操作都是同一个类,如日志,在每个功能上都需要操作日志。这个日志就可以是切面,一个横跨多个核心逻辑的功能。

  • 连接点:
    • 在一个功能中插入一个方法,这个方法的执行就可以说是一个连接点。通过连接点,可以实现对一个系统的各个方面进行灵活的增强和监控,而不会影响核心业务逻辑的代码。

  • 切入点:
    • 就是一些对象中同样的插入方法执行,这些方法的执行点集合就是切入点。

  • 通知:
    • 在特定连接点上执行的动作,如在方法的执行前、执行后,打印出不同的任务信息。

  • 引介:
    • 有一个类,原本没有一个功能,但是可以通过引介为这个类动态地增加一个接口,并实现相应的方法。

  • 织入:
    • 将切面集合整合到系统的执行流程中,如在编译时、类加载时呼叫哦这运行时将这个相应的切面代码插入到合适的连接点。

  • 拦截器:
    • 拦截器可以看作一种实现增强的方式。

  • 目标对象:
    • 目标对象是真正执行业务核心逻辑的对象。

AOP 代理:

  • 当使用AOP对目标对象进行增强后,客户端持有的就是增强后的AOP对象。

  • 如当客户端调用非核心逻辑的方法时,就是调用的是AOP代理对象的方法,这个代理对象会在合适的时候执行切面的逻辑。

动态代理

AOP本质上就是动态代理,动态代理有两种

  • JDK动态代理,Spring的AOP的默认实现,要求必须实现接口

  • CGLIB动态代理,Spring的AOP的可选配置,类和接口都支持

使用Spring实现AOP

方式一:使用Spring的API接口(主要是SpringAPI接口实现)
<?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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd"><!--  注册bean  --><bean id="userServiceImpl" class="org.example.Service.UserServiceImpl"> </bean><bean id="log" class="org.example.log.log"> </bean><bean id="afterlog" class="org.example.log.Afterlog"> </bean><!--  配置Aop:需要导入aop的约束,上面的xmlns处  --><!--  方式一:使用原生的Spring API接口  --><aop:config><!--    切入点:expression:表达式execution(要执行的位置)    --><aop:pointcut id="pointcut" expression="execution(* org.example.Service.UserServiceImpl.*(..))"/><!--    执行环绕增强!    --><aop:advisor advice-ref="log" pointcut-ref="pointcut"/><aop:advisor advice-ref="afterlog" pointcut-ref="pointcut"/></aop:config>
</beans>
public class log implements MethodBeforeAdvice {@Override/*method:要执行的目标对象的方法* objects:参数* target:目标对象**/public void before(Method method, Object[] args, Object target) throws Throwable {System.out.println(target.getClass().getName()+"的"+method.getName()+"被执行了");}
}
public class Afterlog implements AfterReturningAdvice {@Overridepublic void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {System.out.println("执行了"+method.getName()+"返回结果为:"+returnValue);}
}
方式二:使用自定义类来实现AOP(主要是切面)
    <!--  方式二:自定义类  --><bean id="diyPointCut" class="org.example.diy.DiyPointCut"> </bean><aop:config><!--    自定义切面,ref 要引用的类    --><aop:aspect ref="diyPointCut"><!--    切入点    --><aop:pointcut id="point" expression="execution(* org.example.Service.UserServiceImpl.*(..))"/><!--     通知       --><aop:before method="before" pointcut-ref="point"/><aop:after method="after" pointcut-ref="point"/></aop:aspect></aop:config>
public class DiyPointCut {public void before(){System.out.println("方法执行前");}public void after(){System.out.println("方法执行后");}
}
方式三:使用注解实现
        <!--    方式三:使用注解实现--><bean id="annotationPointCut" class="org.example.AnnotationPointCut"> </bean><!--    开启注解支持!--><aop:aspectj-autoproxy/>
@Aspect
//标注这个类是一个切面
public class AnnotationPointCut {@Before("execution(* org.example.Service.UserServiceImpl.*(..))")public void before(){System.out.println("====方法执行前====");}@After("execution(* org.example.Service.UserServiceImpl.*(..))")public void after(){System.out.println("方法执行后");}
}

相关文章:

Java - Spring框架 (ios+aop)

Spring 简介 Spring框架是为了解决企业应用开发的复杂性&#xff0c;使用基本的JavaBean代替EJB&#xff0c;并提供了更多的企业应用功能&#xff0c;Spring是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架。 Spring优点 Spring是一个开源的免费的框架(容器) Spring是一…...

计算机网络(十) —— IP协议详解,理解运营商和全球网络

目录 一&#xff0c;关于IP 1.1 什么是IP协议 1.2 前置认识 二&#xff0c;IP报头字段详解 三&#xff0c;网段划分 3.1 IP地址的构成 3.2 网段划分 3.3 子网划分 3.4 IP地址不足问题 四&#xff0c;公网IP和私有IP 五&#xff0c;理解运营商和全球网络 六&#xff…...

速速收藏!这些2024年上映的AI电影与短剧,申请加入你的国庆假期宅家计划!

2024年上映的AI电影 01 科幻惊悚电影《致命AI Afraid》 导演&#xff1a;克里斯韦兹上映日期:2024-08-30(美国)片长:84分钟剧情简介&#xff1a;Curtis一家被选中去测试一种革新性的居家设备&#xff1a;数字家庭助手AIA&#xff0c;包括各种感应设备和摄像头等&#xff0c;…...

23.2 prometheus为k8s做的4大适配工作

本节重点介绍 : k8s监控中的4大采集类型总结prometheus为k8s监控做的4大适配工作 k8s关注指标分析 在监控每个细分的领域时&#xff0c;我们都要先思考下到底需要关注哪些方面的指标。k8s中组件复杂&#xff0c;我们主要专注的无外乎四大块指标&#xff1a;容器基础资源指标…...

1、如何查看电脑已经连接上的wifi的密码?

在电脑桌面右下角的如下位置&#xff1a;双击打开查看当前连接上的wifi的名字&#xff1a;ZTE-kfdGYX-5G 按一下键盘上的win R 键, 输入【cmd】 然后&#xff0c;按一下【回车】。 输入netsh wlan show profile ”wifi名称” keyclear : 输入完成后&#xff0c;按一下回车&…...

循环链表和双向链表

一、 带尾指针的循环链表的合并 算法步骤&#xff1a; p存表头结点——pTa->next;Tb表头连接到Ta表尾——Ta->nextTb->next->next;释放Tb表头结点——delate Tb->next;修改指针——Tb->nextp; LinkList Connect(LinkList Ta,LinkList Tb){pTa->next; …...

【Linux庖丁解牛】—Linux基本指令(中)!

&#x1f308;个人主页&#xff1a;秋风起&#xff0c;再归来~&#x1f525;系列专栏&#xff1a; Linux庖丁解牛 &#x1f516;克心守己&#xff0c;律己则安 目录 1、rmdir与rm指令 2、man指令 3、cp指令 4、mv指令 5、cat与tac指令 6、重定向 7、more指令 8、…...

【电路笔记】-运算放大器微分器

运算放大器微分器 文章目录 运算放大器微分器1、概述2、运算放大器微分器的表示2.1 理想微分器2.2 输出公式2.3 交流分析3、实际微分器3.1 理想配置的局限性3.2 带串联电阻的伪微分器3.3 具有并联电容器的伪微分器4、总结1、概述 在我们之前关于积分器运算放大器的文章中,我们…...

【Unity踩坑】使用内购时获取Google Play license key

在Unity中使用了IAP&#xff08;内购&#xff09;后&#xff0c;需要设置Google Play license key。 这个key需要在Google Play Console中&#xff08;https://play.google.com/console&#xff09;&#xff0c;找到相应的应用&#xff0c;在左侧“创收设置”里可以找到license…...

华为OD机试真题-数组拼接-2024年OD统一考试(E卷)

最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客 每一题都含有详细的解题思路和代码注释,精选c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。 题目描述 现在有多组整数数…...

【Android 14源码分析】Activity启动流程-2

忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  – 服装…...

ubuntu 18.04 cuda 11.01 gpgpu-sim 裸机编译

1&#xff0c;环境 ubuntu 18.04 x86_64 cuda 11.01 gpgpu-sim master commit 90ec3399763d7c8512cfe7dc193473086c38ca38 2&#xff0c;预备环境 一个比较新的 ubuntu 18.04&#xff0c;为了迎合 cuda 11.01 的版本需求 安装如下软件&#xff1a; sudo apt-get instal…...

【Kubernetes】常见面试题汇总(五十二)

目录 116. K8S 集群服务暴露失败&#xff1f; 117.外网无法访问 K8S 集群提供的服务&#xff1f; 特别说明&#xff1a; 题目 1-68 属于【Kubernetes】的常规概念题&#xff0c;即 “ 汇总&#xff08;一&#xff09;~&#xff08;二十二&#xff09;” 。 题目 69-…...

o1-preview 在 IMO 2024 第一题的实测表现

相关博客&#xff1a;Learning to Reason with LLMs 以及 Introducing OpenAI o1-preview 测试了 IMO 2024 的第一题&#xff0c;OpenAI-o1-preview 的解题过程包括两部分&#xff1a;思考和推理。 正确答案是全体偶数&#xff0c;o1-preview 的 **思考方向正确&#xff0c;推…...

iOS--RunLoop原理

前言 曾经在写项目的时候遇到过这么一个问题。&#xff1a; 项目中添加了一个tableview&#xff0c;然后还有一个计时器&#xff0c;当滑动tableview的时候会阻塞计时器&#xff0c;你得执行这么一段代码后&#xff0c;计时器才能正常运行。 RunLoop.current.add(timer, for…...

并查集——从LeetCode题海中总结常见套路

目录 并查集定义 LeetCode128.最长连续序列 先去重再sort&#xff1a; 改进去重的方法&#xff1a; 参考&#xff1a; 并查集定义 在计算机科学中&#xff0c;并查集是一种树型的数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint Sets&#xff09;的合并及查…...

深入理解作用域【JavaScript】

一、作用域的内部原理 JavaScript 的作用域机制是理解变量如何被访问和存储的重要概念。下面详细介绍作用域的内部原理&#xff0c;包括编译、执行、查询、嵌套和异常处理这五个步骤。 1. 编译 在 JavaScript 的执行过程中&#xff0c;首要的步骤是编译。尽管JavaScript是解…...

微信小程序实战教程:如何使用map组件实现地图功能

在微信小程序中&#xff0c;map组件是一个非常实用的功能&#xff0c;它可以帮助我们快速实现地图展示、定位、标注等操作。本文将详细介绍如何在微信小程序中使用map组件&#xff0c;带你轻松掌握地图开发技能。 一、map组件概述 map组件是微信小程序官方提供的一个地图组件…...

张雪峰谈人工智能技术应用专业的就业前景!

一、张雪峰谈人工智能技术应用专业 在教育咨询领域&#xff0c;张雪峰老师以其深入浅出的讲解和前瞻性的视角&#xff0c;为广大学子提供了宝贵的专业选择建议。对于人工智能技术应用专业&#xff0c;张雪峰老师通常给予高度评价&#xff0c;认为这是一个充满无限可能且就业前…...

机器学习课程学习周报十五

机器学习课程学习周报十五 文章目录 机器学习课程学习周报十五摘要Abstract一、机器学习部分1. 统计推断与贝叶斯推断2. GMM和EM算法补充3. 马尔可夫链蒙特卡罗法3.1 蒙特卡罗法3.2 马尔可夫链3.3 Diffusion模型中的马尔可夫链 总结 摘要 本周的学习涵盖了统计推断和贝叶斯推断…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...