spring知识总结

2023-05-16

什么是spring

spring是一套提供IOC和AOP功能架,为简洁开发提供的一套轻量级框架。主要包括一下几个模块:

  1. spring context:提供框架式的bean访问方式,以及企业级任务(定时任务)等
  2. spring beans:是ioc最著名的实现,是spring的基石。beans的核心是beanfactory和BeanDefinition。BeanDefinition就像是java中的pojo。
  3. spring core:核心类库,所有功能都依赖于该类库,提供IOC和DI服务。用来负责发现,创建并处理bean之间的关系。
  4. spring aop:提供aop服务
  5. spring mvc:提供面向Web应用的Model-View-Controller,即MVC实现。
  6. spring DAO:对JDBC的抽象封装,简化了数据访问异常的处理,并能统一管理JDBC事务;
  7. Spring ORM:对现有的ORM框架的支持;

IOC的理解

1.含义:ioc意思是控制反转,其核心实现是DI ,指将创建对象的权力交给ioc容器,由spring框架负责控制对象的生命周期和对象的依赖关系。其核心是DI 依赖注入。当我们只需要new一个对象的时候,有没有IOC是没有区别的。但是当我们new的这个对象又依赖了很多对象的时候就会变得及其麻烦,这时候交给spring 容器的话就会自动帮我解决依赖的问题,提供给我们想要的对象。
2)什么是DI:
IoC 的一个重点就是在程序运行时,动态的向某个对象提供它所需要的其他对象,这一点是通过DI(Dependency Injection,依赖注入)来实现的,即应用程序在运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。而 Spring 的 DI 具体就是通过反射实现注入的,反射允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性
3).IOC的原理:spring的ioc的实现原理是工厂模式加反射机制。而bean如何注册到ioc容器中,以及bean对象的加载,实例化,初始化详细过程可以阅读bean加载流程

4.spring AOP的理解
AOP,一般称为面向切面,作为面向对象的一种补充,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,提高系统的可维护性。可用于权限认证、日志、事务处理。简单来说就是重复利用代码,重复的代码被称为切面。
AOP的关键在于代理模式,分为静态代理AspectJ,动态代理又分为实现接口类就用JDK动态代理或者Cglib动态代理。
1.静态代理:就是在编译阶段生成AOP代理类,并将切面织入到java字节码里卖弄,运行后就是增之后得AOP对象。
2.动态代理:

  1. jdk动态代理核心是InvocationHandler接口和Proxy类,使用proxy类来生成目标类的代理类,当代理对象调用真是对象的方法时,invocationhandler通过invoke方法反射来调用目标类中的代码。
  2. ② 如果被代理类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成指定类的一个子类对象,并覆盖其中特定方法并添加增强代码,从而实现AOP。CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的

5.常见aop术语
在这里插入图片描述

spring通知有哪些

1.前置通知:在连接点之前执行
2.后置通知:在连接点退出后执行
3.环绕通知:包围一个连接点的通知
4.返回后通知:正常返回的通知,若是连接点抛出异常,则不执行
5.抛出异常后通知:在方法抛出异常的时候的通知

Advice的执行顺序

(1)没有异常情况下的执行顺序:

around before advice
before advice
target method 执行
after advice
around after advice
afterReturning advice
(2)出现异常情况下的执行顺序:

around before advice
before advice
target method 执行
after advice
around after advice
afterThrowing advice
java.lang.RuntimeException:异常发生

spring容器的启动流程

1.初始化spring 容器,注册内置的beanpostprocessor的beandefinition到容器中:
① 实例化BeanFactory【DefaultListableBeanFactory】工厂,用于生成Bean对象
② 实例化BeanDefinitionReader注解配置读取器,用于对特定注解(如@Service、@Repository)的类进行读取转化成 BeanDefinition 对象,(BeanDefinition 是 Spring 中极其重要的一个概念,它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)
③ 实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定的包目录进行扫描查找 bean 对象
2.将配置类的beandefination注册到容器中
3.调用refresh方法刷新容器
① prepareRefresh()刷新前的预处理:
② obtainFreshBeanFactory():获取在容器初始化时创建的BeanFactory:
③ prepareBeanFactory(beanFactory):BeanFactory的预处理工作,向容器中添加一些组件:
④ postProcessBeanFactory(beanFactory):子类重写该方法,可以实现在BeanFactory创建并预处理完成以后做进一步的设置
⑤ invokeBeanFactoryPostProcessors(beanFactory):在BeanFactory标准初始化之后执行BeanFactoryPostProcessor的方法,即BeanFactory的后置处理器:
⑥ registerBeanPostProcessors(beanFactory):向容器中注册Bean的后置处理器BeanPostProcessor,它的主要作用是干预Spring初始化bean的流程,从而完成代理、自动注入、循环依赖等功能
⑦ initMessageSource():初始化MessageSource组件,主要用于做国际化功能,消息绑定与消息解析:
⑧ initApplicationEventMulticaster():初始化事件派发器,在注册监听器时会用到:
⑨ onRefresh():留给子容器、子类重写这个方法,在容器刷新的时候可以自定义逻辑
⑩ registerListeners():注册监听器:将容器中所有的ApplicationListener注册到事件派发器中,并派发之前步骤产生的事件:
⑪ finishBeanFactoryInitialization(beanFactory):初始化所有剩下的单实例bean,核心方法是preInstantiateSingletons(),会调用getBean()方法创建对象;
⑫ finishRefresh():发布BeanFactory容器刷新完成事件

更详细的参考:spring容器启动流程

bean的生命周期

大概有实例化,属性设置,初始化阶段,销毁阶段

spring生命周期

1.实例化bean
对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用createBean进行实例化。
对于ApplicationContext容器,当容器启动结束后,通过获取BeanDefinition对象中的信息,实例化所有的bean。

2.设置对象的属性(依赖注入):实例化后的对象被封装在BeanWrapper对象中,紧接着,Spring根据BeanDefinition中的信息 以及 通过BeanWrapper提供的设置属性的接口完成属性设置与依赖注入。

3)处理Aware接口:Spring会检测该对象是否实现了xxxAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的一些资源:

①如果这个Bean实现了BeanNameAware接口,会调用它实现的setBeanName(String beanId)方法,传入Bean的名字;
②如果这个Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。
②如果这个Bean实现了BeanFactoryAware接口,会调用它实现的setBeanFactory()方法,传递的是Spring工厂自身。
③如果这个Bean实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文;
(4)BeanPostProcessor前置处理:如果想对Bean进行一些自定义的前置处理,那么可以让Bean实现了BeanPostProcessor接口,那将会调用postProcessBeforeInitialization(Object obj, String s)方法。

(5)InitializingBean:如果Bean实现了InitializingBean接口,执行afeterPropertiesSet()方法。

(6)init-method:如果Bean在Spring配置文件中配置了 init-method 属性,则会自动调用其配置的初始化方法。

(7)BeanPostProcessor后置处理:如果这个Bean实现了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法;由于这个方法是在Bean初始化结束时调用的,所以可以被应用于内存或缓存技术;

以上几个步骤完成后,Bean就已经被正确创建了,之后就可以使用这个Bean了。

(8)DisposableBean:当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用其实现的destroy()方法;

(9)destroy-method:最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。

bean的作用域

1.单例bean
2.原型bean
3.requst:每一个请求创建一个bean
4.session:同一个session共享一个bean
5.global-session :全局作用域

spring基于xml注入bean的几种方式

set方式注入;
构造器注入
静态工厂注入
实例工厂注入

如何解决循环依赖

含义:在为bean进行依赖注入的时候发现了互相依赖的情况(先有鸡还是先有蛋

主要有三种情况:
1.构造方法注入的情况下,使用new会被堵塞住
2.使用setter(多例)的情况下,每一次getbean都会产生一个bean直到内存溢出
3.使用setter(单例)的情况下,这种依赖是可以通过三级缓存解决的,核心原理是,在bean对象实例化之后,依赖注入之前,spring提前暴露的bean实例在第三级缓存中进行存储

自动装配

1)在Spring框架xml配置中共有5种自动装配:

no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。
byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。
byType:通过参数的数据类型进行自动装配。
constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。
autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。
2)基于注解的自动装配方式:

使用@Autowired、@Resource注解来自动装配指定的bean。在使用@Autowired注解之前需要在Spring配置文件进行配置,。在启动spring IoC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowied、@Resource或@Inject时,就会在IoC容器自动查找需要的bean,并装配给该对象的属性。在使用@Autowired时,首先在容器中查询对应类型的bean:

如果查询结果刚好为一个,就将该bean装配给@Autowired指定的数据;

如果查询的结果不止一个,那么@Autowired会根据名称来查找;

如果上述查找的结果为空,那么会抛出异常。解决方法时,使用required=false。

spring事物

spring的事务传播机制:

spring事务的传播机制说的是,当多个事务同时存在的时候,spring如何处理这些事务的行为。事务传播机制实际上是使用简单的ThreadLocal实现的,所以,如果调用的方法是在新线程调用的,事务传播实际上是会失效的。

① PROPAGATION_REQUIRED:(默认传播行为)如果当前没有事务,就创建一个新事务;如果当前存在事务,就加入该事务。

② PROPAGATION_REQUIRES_NEW:无论当前存不存在事务,都创建新事务进行执行。

③ PROPAGATION_SUPPORTS:如果当前存在事务,就加入该事务;如果当前不存在事务,就以非事务执行。‘

④ PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

⑤ PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则按REQUIRED属性执行。

⑥ PROPAGATION_MANDATORY:如果当前存在事务,就加入该事务;如果当前不存在事务,就抛出异常。

⑦ PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。

3)Spring中的隔离级别:

① ISOLATION_DEFAULT:这是个 PlatfromTransactionManager 默认的隔离级别,使用数据库默认的事务隔离级别。

② ISOLATION_READ_UNCOMMITTED:读未提交,允许事务在执行过程中,读取其他事务未提交的数据。

③ ISOLATION_READ_COMMITTED:读已提交,允许事务在执行过程中,读取其他事务已经提交的数据。

④ ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内,任意时刻的查询结果都是一致的。

⑤ ISOLATION_SERIALIZABLE:所有事务逐个依次执行。

spring用了哪些设计模式

1.工厂模式 beanfactory
2.单例模式,bean默认单例模式
3.代理模式:aop使用了代理模式,proxy生成代理类,invacationhandler 利用反射调用被代理类的方法
4.模板方法

spring有哪些不同类型的事件

1.上下文更新事件
2.上下文开始事件
3.上下文停止事件
4.上下文关闭事件
5.请求处理事件

注解

Java 注解就是代码中的一些特殊标记(元信息),用于在编译、类加载、运行时进行解析和使用,并执行相应的处理。它本质是继承了 Annotation 的特殊接口,其具体实现类是 JDK 动态代理生成的代理类,通过反射获取注解时,返回的也是 Java 运行时生成的动态代理对象 $Proxy1。通过代理对象调用自定义注解的方法,会最终调用 AnnotationInvocationHandler 的 invoke 方法,该方法会从 memberValues 这个Map中查询出对应的值,而 memberValues 的来源是Java常量池。

    注解在实际开发中非常常见,比如 Java 原生的 @Overried、@Deprecated 等,Spring的 @Controller、@Service等,Lombok 工具类也有大量的注解,不过在原生 Java 中,还提供了元 Annotation(元注解),他主要是用来修饰注解的,比如 @Target、@Retention、@Document、@Inherited 等。

@Target:标识注解可以修饰哪些地方,比如方法、成员变量、包等,具体取值有以下几种:ElementType.TYPE/FIELD/METHOD/PARAMETER/CONSTRUCTOR/LOCAL_VARIABLE/ANNOTATION_TYPE/PACKAGE/TYPE_PARAMETER/TYPE_USE
@Retention:什么时候使用注解:SOURCE(编译阶段就丢弃) / CLASS(类加载时丢弃) / RUNTIME(始终不会丢弃),一般来说,我们自定义的注解都是 RUNTIME 级别的,因为大多数情况我们是根据运行时环境去做一些处理,一般需要配合反射来使用,因为反射是 Java 获取运行是的信息的重要手段
@Document:注解是否会包含在 javadoc 中;
@Inherited:定义该注解与子类的关系,子类是否能使用。
(2)如何自定义注解?

① 创建一个自定义注解:与创建接口类似,但自定义注解需要使用 @interface

② 添加元注解信息,比如 @Target、@Retention、@Document、@Inherited 等

③ 创建注解方法,但注解方法不能带有参数

④ 注解方法返回值为基本类型、String、Enums、Annotation 或其数组

⑤ 注解可以有默认值;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring知识总结 的相关文章

  • anaconda:安装cuda和对应版本的cudnn

    复现别人论文的时候经常遇到不同的cuda版本 xff0c 可以使用anaconda创建虚拟环境 xff0c 并在不同的虚拟环境中配置对应的cuda版本 1 安装anaconda及虚拟环境使用 Anaconda多个python版本 xff08
  • Linux Server 种脚本自动执行

    在我们用python编写完脚本后 xff0c 时常需要定时运行我们的脚本 在这里 xff0c 我为大家介绍两种常用定时执行python脚本文件的方式 xff1a 第一种 xff1a crontab job 在Linux系统中可以通过设置cr
  • Tomcat9配置HTTP/2

    1 概述 Tomcat从Tomcat8的一些较新版本就支持HTTP 2了 xff0c Tomcat9直接支持 xff0c 本文首先讲述了相关HTTP 2的特性 xff0c 接着利用一个简单的开源工具mkcert生成证书并利用该证书配置HTT
  • SVN提交代码报错,怎么破?

    目录 SVN提交代码报错1 SVN提交被锁定 xff08 locked xff09 2 SVN提交已存在版本控制信息 xff08 is already under version control xff09 SVN提交代码报错 1 SVN提
  • Hive隐藏分割字符\001替换为可见字符

    Hive默认的分隔符是 001 xff0c 属于不可见字符 xff0c 这个字符在vi里是 A 一个文本0000 0 xff0c 直接cat内容如下 xff1a 320643204N2559613979 320828796N446323 3
  • 计算机毕业设计 HTML+CSS+JavaScript食品餐饮行业网站(10页)

    x1f380 精彩专栏推荐 x1f447 x1f3fb x1f447 x1f3fb x1f447 x1f3fb 作者简介 一个热爱把逻辑思维转变为代码的技术博主 x1f482 作者主页 主页 x1f680 获取更多优质源码 x1f393 w
  • 基于Redis实现的布隆过滤器

    一 RedisTemplate 1 首先将guava实现的本地的布隆过滤器的算法代码拿过来 span class token comment 算法过程 xff1a 1 首先需要k个hash函数 xff0c 每个函数可以把key散列成为1个整
  • Canal和Kafka整合方案——解决Canal写入Kafka并发消费问题

    文章目录 一 问题描述二 引入Kafka1 Canal整合Kafka及项目初步搭建2 整合Kafka后引出新问题 三 最终方案1 修改Canal配置文件2 修改项目代码3 整体架构4 结果验证 四 总结思考五 参考 一 问题描述 在使用Ca
  • 解决项目版本冲突——maven-shade插件使用

    文章目录 背景maven shade plugin介绍解决问题1 环境准备2 解决方案3 引入依赖 一些需要注意的坑maven shade plugins的其他使用 背景 当我们在maven项目中引入第三方组件时 xff0c 三方组件中的依
  • 通关剑指 Offer——剑指 Offer II 055. 二叉搜索树迭代器

    1 题目描述 剑指 Offer II 055 二叉搜索树迭代器 实现一个二叉搜索树迭代器类BSTIterator xff0c 表示一个按中序遍历二叉搜索树 xff08 BST xff09 的迭代器 xff1a BSTIterator Tre
  • 通关剑指 Offer——剑指 Offer II 056. 二叉搜索树中两个节点之和

    1 题目描述 剑指 Offer II 056 二叉搜索树中两个节点之和 给定一个二叉搜索树的 根节点 root 和一个整数 k 请判断该二叉搜索树中是否存在两个节点它们的值之和等于 k 假设二叉搜索树中节点的值均唯一 示例 1 xff1a
  • LeetCode 每日一题——1759. 统计同构子字符串的数目

    1 题目描述 1759 统计同构子字符串的数目 难度中等43 给你一个字符串 s xff0c 返回 s 中 同构子字符串 的数目 由于答案可能很大 xff0c 只需返回对 109 43 7 取余 后的结果 同构字符串 的定义为 xff1a
  • LeetCode 每日一题——1750. 删除字符串两端相同字符后的最短长度

    1 题目描述 1750 删除字符串两端相同字符后的最短长度 给你一个只包含字符 a xff0c b 和 c 的字符串 s xff0c 你可以执行下面这个操作 xff08 5 个步骤 xff09 任意次 xff1a 选择字符串 s 一个 非空
  • LeetCode 每日一题——2032. 至少在两个数组中出现的值

    1 题目描述 2032 至少在两个数组中出现的值 给你三个整数数组 nums1 nums2 和 nums3 xff0c 请你构造并返回一个 元素各不相同的 数组 xff0c 且由 至少 在 两个 数组中出现的所有值组成 数组中的元素可以按
  • 解决win10使用电池时自动调节亮度问题

    问题描述 Win10笔记本在使用电池时会出现根据界面窗口颜色自动调节亮度的问题 xff0c 特别是在使用Idea或Pycharm之类的在切换窗口时的亮度调节会让人感觉崩溃 为了解决这个问题 xff0c 上网找了很多解决方案 xff0c 大多
  • 使用Python一步步实现PCA算法

    使用Python一步步实现PCA算法 标签 xff1a PCA Python 本文原地址为 xff1a http sebastianraschka com Articles 2014 pca step by step html Implem
  • RocketMQ——生产者和消费者

    RocketMQ 生产者和消费者 文章目录 RocketMQ 生产者和消费者RocketMQ简介RocketMQ生产者RocketMQ消费者DefaultMQPushConsumerDefaultMQPullConsumer RocketM
  • RocketMQ——NameServer和Broker

    RocketMQ NameServer和Broker 文章目录 RocketMQ NameServer和BrokerNameServerNameServer功能为什么不用zookeeper xff1f BrokerBroker消息存储Bro
  • CSS sprites

    CSS sprites是什么 xff1f CSS Sprites是一种网页图片应用处理方式 xff0c 就是把网页中一些背景图片整合到一张图片文件中 xff0c 再利用CSS的 background image xff0c backgrou
  • SpringBoot集成WebSocket以及可能遇到的部分问题的解决方式

    1 集成 1 1 首先导入pom依赖 核心是 64 ServerEndpoint这个注解 这个注解是Javaee标准里的注解 xff0c tomcat7以上已经对其进行了实现 xff0c 如果是用传统方法使用tomcat发布项目 xff0c

随机推荐

  • centos7重启network报错:network.service: control process exited, code=exited status=1

    centos7虚拟机中修改固定ip地址后 xff0c 重启 xff08 命令为 xff1a systemctl restart network xff09 network服务时异常 xff1b 使用systemctl status netw
  • 用Future与CountDownLatch实现多线程执行多个异步任务,任务全部完成后返回结果

    span class token keyword import span span class token namespace java span class token punctuation span util span class t
  • gradle (v7.5) 使用

    gradle v7 5 使用 gradle 和 maven 都是项目构建工具 xff0c Gradle和Maven两种构建方式存在一些根本差异 Gradle基于任务依赖关系图 其中任务就是工作 xff0c 而Maven是基于固定的过程和线性
  • 麒麟/linux下安装MySQL,修改root用户密码报错汇总(附安装方法)

    本来用apt get一行代码装好的事情 xff0c 但是出现了大大小小的麻烦 xff0c 所以记录一下 xff0c 供有需要的朋友查看 一 Mysql的安装 apt span class token operator span get in
  • 一篇文章快速搞懂 AOP和SpringAOP

    往期相关文档 最全SpringAop切面 10分钟入门SpringAOP 读不在三更五鼓 xff0c 功只怕一曝十寒 郭沫若 文章目录 一 导言二 AOP2 1 代理模式2 2 AOP核心概念2 2 1 Aspect 切面2 2 1 1 P
  • 最通俗易懂的HashMap深度解析

    文章目录 导言Hash表什么是Hash表为什么要Hash表Hash表核心原理核心概念Hash表hash函数 常见冲突解决方法开放地址法 再散列法 再哈希法链地址法 xff08 拉链法 xff09 java HashMap原理浅析java H
  • SFTP连接失败问题解决小tips

    前几天安装了jumpserver之后 xff0c sftp服务莫名奇妙的挂了 xff0c 也不知道是不是这方面的原因 vsftpd服务检查没有问题 防火墙端口配置检查没有问题 端口监听检查没有问题 我们知道SFTP走的是SSH的端口 xff
  • Error:java: 服务配置文件不正确, 或构造处理程序对象

    在学习注解处理器使用的时候 xff0c 依据这个学习 xff0c 完成后build xff0c 报了个错误 Error java 服务配置文件不正确 或构造处理程序对象javax annotation processing Processo
  • 无自动化测试系统设计方法论

    灵活 敏捷 迭代 自动化测试 辩思 测试必不可少 想想看没有充分测试的代码 哪一次是一次过的 哪一次不需要经历下测试的鞭挞 不要以为软件代码容易改 就对于质量不切实际的自信 那是自大 不适用自动化测试的case 遗留系统 太多的依赖方 不想
  • 模仿 java Optional 设计 c# Optional

    模仿 java Optional 设计 c Optional Unity 环境下 using System span class token punctuation span using JetBrains span class token
  • 关于中台的思考和复盘

    数据中台可以做 xff0c 业务中台不能做 能力共享和聚合的入口可以做 强嵌入的业务中台不能做 中台 中台不是只能是微服务 xff0c 中台还可以是代码复用框架 xff0c 允许业务自己扩展 迭代code as service xff0c
  • 三范式分解算法

    三范式是BC范式的放宽 三范式条件 满足一个即可 gt 是平凡的函数依赖 除了子集和父集的函数依赖 大多的函数依赖都是非平凡的 是关系模式R的一个超码 属性集里的所有属性都被包含在 R的candidate key里 注意 的属性集里的所有元
  • 关系数据库设计 函数依赖 逻辑蕴含

    函数依赖 属性集 决定属性集 则称有函数依赖 to 逻辑蕴含 F能推出 原不直观存在于 函数依赖集F 中的函数依赖
  • 斯密特正交化(matlab)

    斯密特正交化 matlab 数学过程 伪代码如下 function b 61 Gram Schmidt Orthogonalization a row col 61 size a b 1 61 a 1 for i in 2 col for
  • autohotkey[启动][发送键击][click][常用窗口命令]

    启动程序或文档 run命令 run exe file in environment path Run Notepad 不在环境变量中的程序或文档 Run A ProgramFiles Winamp Winamp exe open file
  • 通过键盘移动鼠标光标 autohotkey

    通过键盘移动鼠标光标 MouseMove键 参数定义 MouseMove X Y Speed R 鼠标移动的目标位置的 x y 坐标 可以为 表达式 坐标相对于活动窗口Speed 移动鼠标的速度 xff0c 介于 0 xff08 最快 xf
  • 用Tkinter实现一个离线定时语音播报应用程序

    最近单位领导与我提起 xff0c 说要做一个语音播报功能程序 xff0c 意在定时提醒职工进行抄表工作 在下也是个刚毕业不久的小白 xff0c 从头开始学习Python 对于这个程序虽说小 xff0c 但也只是看起来而已 xff0c 在细节
  • 通过用户POI经纬度获取居住地的房价信息

    Arcmap处理数据 1 建立Map和GDB2 加载数据3加载地图4 导出为点数据5 过滤错误数据6 将过滤后的数据保存为新图层7 转换坐标系为38578 IDW插值9 绘制渔网图Fishnet10 Zonal Statistics As
  • 天干地支

    以下是天干地支的称呼 xff1a 天干地支简称 干支 xff0c 十天干 xff1a 甲 xff08 ji xff09 乙 xff08 y xff09 丙 xff08 b ng xff09 丁 xff08 d ng xff09 戊 xff0
  • spring知识总结

    什么是spring spring是一套提供IOC和AOP功能架 xff0c 为简洁开发提供的一套轻量级框架 主要包括一下几个模块 xff1a spring context xff1a 提供框架式的bean访问方式 xff0c 以及企业级任务