当前位置: 首页 > 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模型中的马尔可夫链 总结 摘要 本周的学习涵盖了统计推断和贝叶斯推断…...

rabbitMq------客户端模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消费者模块信道管理模块管理的字段提供的接口 信道内存管理连接管理类 前言 在RabbitMQ中&#xff0c;提供服务的是信道&#xff0c;因此在客⼾端的实现中&…...

地理定位营销与开源AI智能名片O2O商城小程序的融合与发展

摘要&#xff1a;本文阐述地理定位营销的概念、手段及其在商业中的应用&#xff0c;探讨开源AI智能名片O2O商城小程序如何与地理定位营销相结合&#xff0c;为企业营销带来新的机遇与挑战。 一、引言 在当今数字化营销的时代&#xff0c;地理定位营销已成为一种重要的营销手段…...

解决Vue应用中遇到路由刷新后出现 404 错误

解释&#xff1a; Vue 应用中遇到路由刷新后出现 404 错误&#xff0c;通常是因为 Vue 应用是个单页应用&#xff08;SPA&#xff09;&#xff0c;它通过 Vue Router 管理路由&#xff0c;通过 HTML5 History Mode 实现页面导航无需重新加载页面。当直接访问非首页的路由或者刷…...

在window10下使用directml加速phi-3模型的一些记录

1.安装anaconda&#xff0c;安装python 安装torch等参考网上资料非常多 不细描述 2.参考微软官网【在windows上通过DirectML启用Pytorch文档&#xff0c;检查系统版本 检查gpu版本 3.参考微软官网【在windows上通过DirectML启用Pytorch】文档&#xff0c;安装torch_directml模…...

通信工程学习:什么是OSPF开放式最短路径优先

OSPF&#xff1a;开放式最短路径优先 OSPF&#xff08;Open Shortest Path First&#xff0c;开放式最短路径优先&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;被广泛应用于计算机网络中&#xff0c;特别是在构建大型和复杂的网络时。以下是对OSPF的…...

《中国电子报》报道: 安宝特AR为产线作业者的“秘密武器

近日&#xff0c;中国电子报在其文章《下一代工业智能终端重新定义制造业》中对安宝特的增强现实&#xff08;AR&#xff09;解决方案给予了高度评价&#xff0c;称其为产线作业者的“秘密武器”。这一创新技术改变了传统制造业的作业方式&#xff0c;使得操作人员能够在生产过…...

【Android】Handler消息机制

文章目录 前言概述核心组件概述Android消息机制概述 Android消息机制分析ThreadLocal的工作原理ThreadLocal基础ThreadLocal实现原理 MessageQueueLooperHandler的工作原理总结 前言 本文用于记录Android的消息机制&#xff0c;主要是指Handler的运行机制。部分内容参考自《An…...

大数据必懂知识点:Parquet、ORC还是Avro作为数据存储格式,哪种在性能和压缩率上更优

目录 第一章 相关理论 1.1 Parquet格式介绍 1.1.1 起源与发展 1.1.2 特点与优势 1.2 ORC格式介绍 1.3 Avro格式介绍 1.3.1 跨语言支持 1.3.2 动态映射 1.3.3 丰富的数据模式 1.3.4 数据模式灵活性 第二章 种格式性能比较 2.1 读写性能对比 2.2 查询性能对比 2.3 压…...

P1387 最大正方形

题目描述 在一个nm 的只包含 0 和 1 的矩阵里找出一个不包含 0 的最大正方形&#xff0c;输出边长。 输入格式 输入文件第一行为两个整数n,m(1≤n,m≤100)&#xff0c;接下来 n 行&#xff0c;每行 m 个数字&#xff0c;用空格隔开&#xff0c;0 或 1。 输出格式 一个整数…...

Python知识点:如何使用Multiprocessing进行并行任务管理

开篇&#xff0c;先说一个好消息&#xff0c;截止到2025年1月1日前&#xff0c;翻到文末找到我&#xff0c;赠送定制版的开题报告和任务书&#xff0c;先到先得&#xff01;过期不候&#xff01; 如何在Python中使用Multiprocessing进行并行任务管理 在现代编程中&#xff0c;…...