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

Java基础知识-第14章-Java注解

1、注解(Annotation)概述

  • 从JDK5.0开始,Java增加了对元数据(MetaData) 的支持,也就是Annotation(注解)
  • Annotation其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。 代码分析工具、开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。
  • Annotation 可以像修饰符一样被使用,可用于修饰包,类,构造器,方法,成员变量,参数,局部变量的声明,这些信息被保存在Annotation“name=value”对中。

框架=注解+反射+设计模式

2、常见的Annotation示例

使用Annotation时要在其前面增加@符号,并把该Annotation当成一个修饰符使用。用于修饰它支持的程序元素

2.1、生成文档相关的注解

@author//标明开发该类模块的作者,多个作者之间使用,分割
@versio//n标明该类模块的版本
@see//参考转向,也就是相关主题
@since//从哪个版本开始增加的
@param//对方法中某参数的说明,如果没有参数就不能写
@return//对方法返回值的说明,如果方法的返回值类型是void就不能写
@exception//对方法可能抛出的异常进行说明,如果方法没有用throws显式抛出的异常就不能写

其中@param@return@exception这三个标记都是只用于方法的。

  • @param的格式要求: @param 形参名 形参类型 形参说明
  • @return的格式要求: @return 返回值类型 返回值说明
  • @exception的格式要求:
    • @exception异常类型异常说明
    • @param和@exception可以并列多个
package com.annotation.javadoc;
/**
* @author lemon
* @version 1.0
* @see Math.java
*/
public class JavadocTest {/*** 程序的主方法,程序的入口* @param args String[] 命令行参数*/public static void main(String[] args) {}/*** 求圆面积的方法* @param radius double 半径值* @return double 圆的面积*/public static double getArea(double radius){return Math.PI * radius * radius;}
}

2.2、JDK内置的三个基本注解

会在编译的时候进行格式检查

  • @Override::限定重写父类方法,该注解只能用于方法
  • @Deprecated:用于表示所修饰的元素(类,方法等) 已过时。
  • @SuppressWarnings:抑制编译器警告
package com.annotation.javadoc;
public class AnnotationTest{public static void main(String[] args) {@SuppressWarnings("unused")int a = 10;//没有使用这个变量}@Deprecatedpublic void print(){System.out.println("过时的方法");}@Overridepublic String toString() {return "重写的toString方法()";}
}

2.3、跟踪代码依赖性,实现替代配置文件功能

1、Servlet3.0提供了注解(annotation),使得不再需要在web.xml文件中进行Servlet的部署

@WebServlet("/login")
public class LoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException { }protected void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {doGet(request, response);} 
}

xml配置文件

<servlet><servlet-name>LoginServlet</servlet-name><servlet-class>com.servlet.LoginServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern>
</servlet-mapping>

2、spring框架中关于“事务”的管理

@Transactional(propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED,readOnly=false,timeout=3)
public void buyBook(String username, String isbn) {//1.查询书的单价int price = bookShopDao.findBookPriceByIsbn(isbn);//2. 更新库存bookShopDao.updateBookStock(isbn);//3. 更新用户的余额bookShopDao.updateUserAccount(username, price);
}

xml文件

<!-- 配置事务属性 -->
<tx:advice transaction-manager="dataSourceTransactionManager" id="txAdvice"><tx:attributes><!-- 配置每个方法使用的事务属性 --><tx:method name="buyBook" propagation="REQUIRES_NEW"isolation="READ_COMMITTED" read-only="false" timeout="3" /></tx:attributes>
</tx:advice>

3、自定义Annotation

自定义注解类时, 可以指定目标 (类、方法、字段, 构造函数等) , 注解的生命周期(运行时,class文件或者源码中有效), 是否将注解包含在javadoc中及是否允许子类继承父类中的注解,具体如下:

参考@SuppressWarnings定义,查看其源码

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {/*** The set of warnings that are to be suppressed by the compiler in the* annotated element.  Duplicate names are permitted.  The second and* successive occurrences of a name are ignored.  The presence of* unrecognized warning names is <i>not</i> an error: Compilers must* ignore any warning names they do not recognize.  They are, however,* free to emit a warning if an annotation contains an unrecognized* warning name.** <p> The string {@code "unchecked"} is used to suppress* unchecked warnings. Compiler vendors should document the* additional warning names they support in conjunction with this* annotation type. They are encouraged to cooperate to ensure* that the same names work across multiple compilers.* @return the set of warnings to be suppressed*/String[] value();
}

所以我们自定义注解步骤如下:

  • 定义新的Annotation类型使用@interface关键字

  • 自定义注解自动继承java.lang.annotation.Annotation接口

  • Annotation的成员变量 ,在Annotation 定义中以无参数方法的形式来声明,如String[] value();。其方法名和返回值定义了该成员的名字和类型。我们称为配置参数。类型只能是八种基本数据类型、String类 型、Class类型、enum类型、Annotation类型、以上所有类型的数组。

  • 可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字,如果只有一个参数成员,建议使用参数名为value

  • 如果定义的注解含有配置参数,那么使用该注解时必须指定参数值,格式是“参数名=参数值”,除非它有默认值。如果只有一个参数成员,且名称为value, 则使用注解的时候可以省略“value=”

  • 没有成员定义的Annotation称为标记; 包含成员变量的Annotation 称为元数据Annotation,如

    //内部没有任何配置参数定义
    public @interface Override {
    }
    

注意:

  • 自定义注解必须配上注解的信息处理流程(使用反射)才有意义。
  • 要获取类、方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,除此之外没有别的获取注解对象的方法
//自定义注解
public @interface MyAnnotation {String value();//配置参数
}//使用注解,由于我们定义的注解含有配置参数,那么使用该注解时必须指定参数值:参数名=参数值,这里可省略
@MyAnnotation(value = "hello")
public class Goods implements Comparable {private int price;@Overridepublic int compareTo(Object o) {if (o instanceof Goods) {Goods goods = (Goods) o;//方法一if (this.price > goods.price) {return 1;} else if (this.price < goods.price) {return -1;} else {return 0;}//方法二// return Double.compare(this.price, goods.price);}throw new RuntimeException("传入的数据类型不一致");}}

当然我们也可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字,如果只有一个参数成员,建议使用参数名为value

//自定义注解
public @interface MyAnnotation {String value() default "hello"
}
//这时候就不需要指定value值了,使用的就是默认值
//@MyAnnotation()
//当然,如果不想使用这个默认值,可以重新指定
@MyAnnotation(value = "abcdefg")
public class Goods implements Comparable {

4、JDK中的元注解——用来修饰注解的注解

JDK的元Annotation用于修饰其他Annotation定义

JDK5.0提供了4个标准的meta-annotation类型, 分别是:

  • ➢Retention
  • ➢Target
  • ➢Documented
  • ➢Inherited

4.1、@Retention

@Retention只能用于修饰一个Annotation定义,用于指定该Annotation(注解)的生命周期@Rentention包含一个RetentionPolicy类型的成员变量,使用@Rentention时必须为该value成员变量指定值:

  • RetentionPolicy.SOURCE:在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释
  • RetentionPolicy.CLASS:在class文件中有效(即class保留),当运行Java程序时,JVM不会保留注解。这是默认值
  • RetentionPolicy.RUNTIME:在运行时有效(即运行时保留),当运行 Java程序时,JVM会保留注释。只有声明为RetentionPolicy.RUNTIME 生命周期的注解,才能通过反射获取它的注解信息。

我们以注解SuppressWarnings为例,它上面就有@Retention(RetentionPolicy.SOURCE)注解,

@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
//表明SuppressWarnings注解可以在编译的时候跳过,即达到取消警告的效果
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {String[] value();
}

我们总结一下@Retention注解的3种生命周期,如下

image.png

4.2、@Target

@Target用于修饰Annotation定义,用于指定被修饰的Annotation能用于修饰哪些程序元素@Target 也包含一个名为value的成员变量(数组类型的)。我们自定义注解一般都会指明两个元注解:@Retention和@Target

我们以注解SuppressWarnings为例,它上面就有@Target注解

//表明SuppressWarnings注解只能修饰类、接口、注解、方法、....
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
@Retention(RetentionPolicy.SOURCE)
public @interface SuppressWarnings {String[] value();
}

解释一下它能取的值和对应的意思

image.png

4.3、@Documented

用于指定被该元Annotation修饰的Annotation类将被javadoc工具提取成文档。默认情况下,javadoc是不包括注解的。

  • 定义为Documented的注解必须设置Retention值为RUNTIME

4.4、@Inherited

被它修饰的Annotation将具有继承性。如果某个类使用了被@Inherited修饰的Annotation,则其子类将自动具有该注解。

  • 比如:如果把标有@Inherited注解的自定义注解标注在类级别上,子类则可以继承父类类级别的注解
  • 实际应用中,使用较少

5、使用反射读取注解信息

JDK 5.0 在 java.lang.reflect 包下新增了 AnnotatedElement 接口, 该接口代表程序中可以接受注解的程序元素

  • 当一个 Annotation 类型被定义为运行时 Annotation 后, 该注解才是运行时可见,当 class 文件被载入时保存在 class 文件中的 Annotation 才会被虚拟机读取
  • 程序可以调用 AnnotatedElement对象的如下方法来访问 Annotation 信息

image.png

自定义注解

//表明该注解只能修饰类
@Target(value= {ElementType.TYPE})
//可以通过反射解析
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {String value();
}
//表明该注解只能修饰属性
@Target(value= {ElementType.FIELD}) 
@Retention(RetentionPolicy.RUNTIME)
public @interface MyField {String columnName();String type();int length();
}

使用注解的类:

@Table("tb_student")//修饰类,注解类,只有一个参数成员,且为value,所以可以省略value
public class MyStudent {@MyField(columnName = "id",type = "int",length = 10)private int id;@MyField(columnName = "sname",type = "varchar",length = 50)private String studentName;@MyField(columnName = "age",type = "int",length = 3)private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getStudentName() {return studentName;}public void setStudentName(String studentName) {this.studentName = studentName;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}
}

反射读取注解信息

package com.lemon.java;import java.lang.annotation.Annotation;
import java.lang.reflect.Field;/*** @Author Lemons* @create 2022-02-23-20:57*/
public class Demo {public static void main(String[] args) {try {Class clazz=MyStudent.class;//获得类的所有有效注解Annotation[] annotations=clazz.getAnnotations();for (Annotation a : annotations) {System.out.println(a);}StringBuffer sb=new StringBuffer("CREATE TABLE ");//获得类的指定的注解Table t=(Table) clazz.getAnnotation(Table.class);System.out.println(t.value());sb.append(t.value()+"(");//获得类的指定属性注解Field f=clazz.getDeclaredField("studentName");MyField myF=f.getAnnotation(MyField.class);System.out.println(myF.columnName()+" "+myF.type()+" "+myF.length());//获得类的所有属性注解Field[] fs=clazz.getDeclaredFields();for (Field field : fs) {MyField myField=field.getAnnotation(MyField.class);System.out.println(myField.columnName()+"--"+myField.type()+"--"+myField.length());sb.append(myField.columnName()+" "+myField.type()+"("+myField.length()+"),");}sb.setCharAt(sb.length()-1,')');sb.append(";");//根据获得的表名、字段的信息拼出DDL语句,然后使用JDBC执行这个SQL,在数据库中生成相关的表System.out.println(sb);} catch (Exception e) {e.printStackTrace();}}
}

结果:

@com.lemon.java.Table(value=tb_student)
tb_student
sname varchar 50
id--int--10
sname--varchar--50
age--int--3
CREATE TABLE tb_student(id int(10),sname varchar(50),age int(3));

6、JDK8中注解的新特性

Java 8对注解处理提供了两点改进:可重复的注解及可用于类型的注解。此外, 反射也得到了加强,在Java8中能够得到方法参数的名称,这会简化标注在方法参数上的注解。

6.1、支持重复注解——借助repeatable注解

jdk8之前

@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {MyAnnotation[] value(); //放一个MyAnnotation注解数组类型的,就可以放置多个注解了
}public @interface MyAnnotation {String value();
}//使用MyAnnotations注解
@MyAnnotations({@MyAnnotation(value = "hello"), @MyAnnotation(value = "hello")})
public class Goods {private int price;
}

jdk8之后——借助repeatable注解

  • MyAnnotation上声明@Repeatable注解,成员值为MyAnnotations.class
  • MyAnnotation上的@Target和@Retention等元注解必须和MyAnnotations上的元注解相同,否则会报错
@Retention(RetentionPolicy.RUNTIME)
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotations {MyAnnotation[] value();
}@Repeatable(MyAnnotations.class)
@Retention(RetentionPolicy.RUNTIME)//只能用runtime
@Target({TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE})
public @interface MyAnnotation {String value();
}@MyAnnotation(value = "hello")
@MyAnnotation(value = "nihao")
public class Goods {private int price;
}

6.2、类型注解

JDK1.8之后,关于元注解@Target的参数类型ElementType枚举值多了两个:

  • TYPE_PARAMETER
  • TYPE_USE。

在Java 8之前,注解只能是在声明的地方所使用,Java8开始,注解可以应用在任何地方。

  • ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中(如:泛型声明)。
  • ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句

举例1

//使用注解
public class TestTypeDefine<@TypeDefine() U> {private U u;public <@TypeDefine() T> void test(T t){}
}//ElementType.TYPE_PARAMETER 表示该注解能写在类型变量的声明语句中
@Target({ElementType.TYPE_PARAMETER})
@interface TypeDefine{
}

举例2

@MyAnnotation
public class AnnotationTest<U> {@MyAnnotationprivate String name;public static void main(String[] args) {AnnotationTest<@MyAnnotation String> t = null;int a = (@MyAnnotation int) 2L;@MyAnnotationint b = 10;}public static <@MyAnnotation T> void method(T t) {}public static void test(@MyAnnotation String arg) throws @MyAnnotation Exception {}
}
//ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句
@Target(ElementType.TYPE_USE)
@interface MyAnnotation {
}
ion
public class AnnotationTest<U> {@MyAnnotationprivate String name;public static void main(String[] args) {AnnotationTest<@MyAnnotation String> t = null;int a = (@MyAnnotation int) 2L;@MyAnnotationint b = 10;}public static <@MyAnnotation T> void method(T t) {}public static void test(@MyAnnotation String arg) throws @MyAnnotation Exception {}
}
//ElementType.TYPE_USE 表示该注解能写在使用类型的任何语句
@Target(ElementType.TYPE_USE)
@interface MyAnnotation {
}

相关文章:

Java基础知识-第14章-Java注解

1、注解(Annotation)概述 从JDK5.0开始&#xff0c;Java增加了对元数据(MetaData) 的支持&#xff0c;也就是Annotation(注解)Annotation其实就是代码里的特殊标记&#xff0c;这些标记可以在编译&#xff0c;类加载&#xff0c;运行时被读取&#xff0c;并执行相应的处理。通…...

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题&#xff1a;一份来自面试官的算法地图&#xff08;题解持续更新中&#xff09;-CSDN博客 算法通关手册&#xff08;LeetCode&#xff09; | 算法通关手册&#xff08;LeetCode&#xff09; (itcharge.cn) 面试经典 150 题 - 学习计…...

【javaweb项目idea版】蛋糕商城(可复用成其他商城项目)

该项目虽然是蛋糕商城项目&#xff0c;但是可以复用成其他商城项目或者购物车项目 想要源码的uu可点赞后私聊 技术栈 主要为&#xff1a;javawebservletmvcc3p0idea运行 功能模块 主要分为用户模块和后台管理员模块 具有商城购物的完整功能 基础模块 登录注册个人信息编辑…...

人格分裂(交互问答)-小白想懂Elasticsearch

通过交互式追问了解一个中间件 ? 啥是Elasticsearch ! 分布式搜索和分析引擎 ? 为啥是分布式搜索&#xff0c;单体难道用不了吗 ? 实际上是说这个东西可以分布式部署 ! 单机可用但扩展性差&#xff0c;分布式通过分片、副本和负载均衡实现海量数据存储与高并发处理 ? 提…...

独立开发者日刊 | Deepseek 统一多模态 AI Janus 开源 |语音秒变文章 | 免费 AI 视频答案引擎

独立开发者产品日刊&#xff0c;每日汇集 ProductHunt 热榜产品介绍&#xff0c;⚡️ 1句Slogan榨干产品灵魂&#xff0c;⚡️ 3秒 get 全球独立开发者的爆款灵感。关注小前&#xff0c;每日捕获全球产品灵感。 Jotform for Canva 标语&#xff1a;为 Canva 创建强大表单类别&a…...

1999-2020年 全国各地区-财政状况分析-一般预算收入-各项税收-个人所得税

1999-2020年 全国各地区-财政状况分析-一般预算收入-各项税收-个人所得税https://download.csdn.net/download/2401_84585615/89575946 https://download.csdn.net/download/2401_84585615/89575946 一般预算收入是指各级政府按照预算法规定&#xff0c;将预计取得的各项收入纳…...

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…...

AboutDialog组件的功能和用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了AlertDialog Widget相关的内容,本章回中将介绍AboutDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 我们在这里说的AboutDialog是一种弹出式窗口&#xff0c;和上一章回中介绍的Al…...

hdfs之读写流程

写入流程&#xff1a; 客户端Client想将文件a.txt上传至hdfs&#xff0c;首先向Namenode发送请求进行权限校验&#xff0c;Namenode通过后会计算出来三个节点&#xff0c;并将这三个节点告知客户端&#xff0c;客户端将输入进行切割成块&#xff0c;一个一个的块进行传输&…...

链表的介绍

目录 引言优缺点与链表相似的数据结构注意事项单向链表的实现基础实现创建类创建成员变量创建特殊方法 增加数据push_back方法insert方法 删除数据del_back方法del_index方法 clear方法查询数据at方法与重载的中括号运算符toArray方法indexOf方法 修改数据获取链表大小测试方法…...

背着开发板回家过年~

大家好&#xff0c;我是bug菌~ 小明&#xff0c;过年了&#xff0c; 别再死磕什么STM32底层驱动、linux平台总线驱动框架、嵌入式实时操作系统源码这些了。 你背着电脑和开发板回家&#xff0c;压根没一点实际用处。 发小们潇洒地出入各种娱乐场所&#xff0c;唱着歌&#xff0…...

Kafka 日志存储 — 磁盘存储

Kafka 依赖与磁盘来存储和缓存消息&#xff0c;采用文件追加的方式来写入消息。顺序写盘的速度快于随机写内存。 1 磁盘存储 除顺序写入外&#xff0c;Kafka中大量使用了页缓存、零拷贝等技术来进一步提升吞吐性能。 1.1 页缓存 页缓存是操作系统实现的一种磁盘缓存&#x…...

【机器学习】自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

一、使用tensorflow框架实现逻辑回归 1. 数据部分&#xff1a; 首先自定义了一个简单的数据集&#xff0c;特征 X 是 100 个随机样本&#xff0c;每个样本一个特征&#xff0c;目标值 y 基于线性关系并添加了噪声。tensorflow框架不需要numpy 数组转换为相应的张量&#xff0…...

RK3568中使用QT opencv(显示基础图像)

文章目录 一、查看对应的开发环境是否有opencv的库二、QT使用opencv 一、查看对应的开发环境是否有opencv的库 在开发板中的/usr/lib目录下查看是否有opencv的库&#xff1a; 这里使用的是正点原子的ubuntu虚拟机&#xff0c;在他的虚拟机里面已经安装好了opencv的库。 二、…...

Brave132 编译指南 Windows 篇:获取源码(六)

1. 引言 在 Brave 浏览器 132 版本的编译过程中&#xff0c;获取源代码是至关重要的第一步。源代码包含了 Brave 浏览器的所有核心功能、特性和组件的实现细节&#xff0c;是深入理解、定制和优化 Brave 的基础。通过获取和管理源代码&#xff0c;开发者能够深入探索 Brave 的…...

解决 pip install 出现 error: subprocess-exited-with-error 错误的方法

解决 pip install 出现 error: subprocess-exited-with-error 错误的方法_pip安装报错 subprocess-CSDN博客文章浏览阅读10w次&#xff0c;点赞62次&#xff0c;收藏86次。通过上述步骤&#xff0c;我们成功解决了 pip install 时出现的 error: subprocess-exited-with-error 错…...

网络安全攻防实战:从基础防护到高级对抗

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 在信息化时代&#xff0c;网络安全已经成为企业、政府和个人必须重视的问题。从数据泄露到勒索软件攻击&#xff0c;每一次…...

DeepSeek大模型技术解析:从架构到应用的全面探索

一、引言 在人工智能领域&#xff0c;大模型的发展日新月异&#xff0c;其中DeepSeek大模型凭借其卓越的性能和广泛的应用场景&#xff0c;迅速成为业界的焦点。本文旨在深入剖析DeepSeek大模型的技术细节&#xff0c;从架构到应用进行全面探索&#xff0c;以期为读者提供一个…...

Deepseek的api调用报错乱码问题

最近的deepseek也是很火&#xff0c;但是在调用api的过程中也会出现一些大大小小的问题&#xff0c;所以这里也给出一种问题和他的解决方案&#xff0c;报错的类型如下图所示 API Streaming Failed Command failed with exit code 1: powershell (Get-CimInstance -ClassName W…...

.NET Core 中依赖注入的使用

ASP.NET Core中服务注入的地方 在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builder.Services中注入。在Controller中可以通过构造方法注入服务。 低使用频率的服务 把Action用到的服务通过Action的参…...

Mysql Resultset 解析记录

Mysql Resultset 解析记录 结果集消息头字段定义结果数据完整spicy文件 结果集消息头 消息头由消息体长度消息序列号消息体组成&#xff1b;消息头长度为3字节&#xff0c;消息序列号长度为1字节。 结果集的消息头消息体内容为结果集的列数。 结果集消息头的spicy1格式如下&a…...

ThinkPhp伪静态设置后,访问静态资源也提示找不到Controller

ThinkPhp没有配置伪静态时&#xff0c;除了默认的IndexController能访问&#xff0c;其他路由Controller都访问不到&#xff0c;提示404错误。配置了伪静态后就解决了这个问题。 但是当我的ThinkPhp后台项目中有静态资源放在public目录&#xff08;或子目录&#xff09;中需要…...

【回溯+剪枝】找出所有子集的异或总和再求和 全排列Ⅱ

文章目录 1863. 找出所有子集的异或总和再求和解题思路&#xff1a;子集问题解法&#xff08;回溯 剪枝&#xff09;47. 全排列 II解题思路&#xff1a;排序 回溯 剪枝 1863. 找出所有子集的异或总和再求和 1863. 找出所有子集的异或总和再求和 一个数组的 异或总和 定义为…...

单细胞-第五节 多样本数据分析,打分R包AUCell

文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…...

锁升级过程与优化操作

前文我们学习了CAS自旋锁知道CAS对应的就是一条指令操作&#xff0c;属于一种轻量级锁&#xff0c;那么有轻必有重&#xff0c;从无锁到轻量级锁到重量级锁是一个升级过程&#xff0c;此文我们对锁升级的过程以及一些优化锁的操作一探究竟。 1. 锁升级 从前文 《程序员不可能不…...

android主题设置为..DarkActionBar.Bridge时自定义DatePicker选中日期颜色

安卓自定义DatePicker选中日期颜色 背景&#xff1a;解决方案&#xff1a;方案一&#xff1a;方案二&#xff1a;实践效果&#xff1a; 背景&#xff1a; 最近在尝试用原生安卓实现仿element-ui表单校验功能&#xff0c;其中的的选择日期涉及到安卓DatePicker组件的使用&#…...

Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`

文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称&#xff08;对于Producer重点检查 client.id&#xff09;4…...

数据分析系列--③RapidMiner算子说明及数据预处理

一、算子说明 1.新建过程 2.算子状态灯 状态灯说明: (1)状态指示灯&#xff1a; 红色:指示灯说明有参数未被设置或输入端口未被连接等问题; 黄色:指示灯说明还未执行算子&#xff0c;不管配置是否基本齐全; 绿色:指示灯说明一切正常&#xff0c;已成功执行算子。 (2)三角…...

Gradle配置指南:深入解析settings.gradle.kts(Kotlin DSL版)

文章目录 Gradle配置指南&#xff1a;深入解析settings.gradle.kts&#xff08;Kotlin DSL版&#xff09;settings.gradle.kts 基础配置选项单项目配置多项目配置 高级配置选项插件管理&#xff08;Plugin Management&#xff09;基础配置模板案例&#xff1a;Android项目标准配…...

专为课堂打造:宏碁推出三款全新耐用型 Chromebook

IT之家 1 月 25 日消息&#xff0c;宏碁&#xff08;Acer&#xff09;昨日&#xff08;1 月 24 日&#xff09;发布公告&#xff0c;针对教育市场&#xff0c;推出 Chromebook Spin 512 (R857T)、Chromebook Spin 511 (R757T) 和 Chromebook 511 (C737) 三款产品&#xff0c;兼…...

电商系统-用户认证(三)基于公钥解析JWT令牌

一、 基于私钥生成jwt令牌 步骤&#xff1a; 导入认证服务 将shangcheng_user_auth工程导入到项目中去&#xff0c;如下图 启动eureka&#xff0c;再启动认证服务 3&#xff09; 认证服务中创建测试类 public class CreateJwtTest { ​ /**** 创建令牌测试*/Testpublic voi…...

验证回文串

hello 大家好&#xff01;今天开写一个新章节&#xff0c;每一天一道算法题。让我们一起来学习算法思维吧&#xff01; function isPalindrome(s) {// 第一步&#xff1a;将字符串中的所有大写字符转换为小写字符s s.toLowerCase();// 第二步&#xff1a;使用正则表达式移除所…...

Java定时任务实现方案(四)——Spring Task

Spring Task 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第四个方案&#xff0c;使用Spring Task&#xff0c;以及该方案的优点和缺点。 ​ Spring Task是Spring框架提供的一个轻量级任务调度框架&#xff0c;用于简化任务调度的开放&#xff0c;通过注解或XML配置的…...

Python 数据分析 - Matplotlib 绘图

Python 数据分析 - Matplotlib 绘图 简介绘图折线图单线多线子图 散点图直方图条形图纵置横置多条 饼图 简介 Matplotlib 是 Python 提供的一个绘图库&#xff0c;通过该库我们可以很容易的绘制出折线图、直方图、散点图、饼图等丰富的统计图&#xff0c;安装使用 pip install…...

深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用

title: 深入探讨数据库索引类型:B-tree、Hash、GIN与GiST的对比与应用 date: 2025/1/26 updated: 2025/1/26 author: cmdragon excerpt: 在现代数据库管理系统中,索引技术是提高查询性能的重要手段。当数据量不断增长时,如何快速、有效地访问这些数据成为了数据库设计的核…...

【Redis】hash 类型的介绍和常用命令

1. 介绍 Redis 中存储的 key-value 本身就是哈希表的结构&#xff0c;存储的 value 也可以是一个哈希表的结构 这里每一个 key 对应的一个 哈希类型用 field-value 来表示 2. 常用命令 命令 介绍 时间复杂度 hset key field value 用于设置哈希表 key 中字段 field 的值为…...

World Creator地形导入UE

修改导出分辨率1009x1009, 虚幻默认参数的整体分辨率是1009 导出预设选择高度图&#xff08;heigh map&#xff09;格式选择PNG 16位,或者RAW 16位&#xff0c;需要反转y轴&#xff08;与虚幻不同&#xff09;&#xff0c;命名格式会自动带一个 , 将改成_ 或者删掉自己命名 &am…...

mybatis(104/134)

动态sql标签&#xff0c;用于选择查询 if标签 where标签 &#xff1a;自动生成where&#xff0c;取决于后面有没有条件&#xff0c;会自动去除条件前面的and和or&#xff0c;不会去除语句后面的 trim标签&#xff1a;自动生成where&#xff0c;在语句后自动去除后缀and和or for…...

制造企业的成本核算

一、生产成本与制造费用的区别 (1)生产成本,是直接用于产品生产,构成产品实体的材料成本。 包括企业在生产经营过程中实际消耗的原材料、辅助材料、备品备件、外购半成品、燃料、动力包装物以及其它直接材料,和直接参加产品生产的工人工资,以及按生产工人的工资总额和规…...

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…...

详解排序算法

文章目录 1. 排序算法分类2. 比较排序算法介绍2.1 插入排序2.1.1 直接插入排序2.1.2 希尔排序 2.2 选择排序2.2.1 直接选择排序2.2.2 堆排序2.2.2.1 向下调整算法建堆2.2.2.2 向上调整算法建堆2.2.2.3 进行堆排序2.2.2.4 堆排序时间、空间复杂度分析2.2.2.5 利用堆排序解决TOP-…...

练习题 - Django 4.x File 文件上传使用示例和配置方法

在现代的 web 应用开发中,文件上传是一个常见的功能,无论是用户上传头像、上传文档,还是其他类型的文件,处理文件上传都是开发者必须掌握的技能之一。Django 作为一个流行的 Python web 框架,提供了便捷的文件上传功能和配置方法。学习如何在 Django 中实现文件上传,不仅…...

Vue 响应式渲染 - 待办事项简单实现

Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue 响应式渲染 - 待办事项简单实现 目录 待办事项简单实现 页面初始化 双向绑定的指令 增加留言列表设置 增加删除按钮 最后优化 总结 待办事项简单实现 页面初始化 对页面进行vue的引入、创建输入框和按钮及实例化V…...

【福州市AOI小区面】shp数据学校大厦商场等占地范围面数据内容测评

AOI城区小区面样图和数据范围查看&#xff1a; — 字段里面有name字段。分类比较多tpye&#xff1a;每个值代表一个类型。比如字段type中1549代表小区住宅&#xff0c;1563代表学校。小区、学校等占地面积范围数据 —— 小区范围占地面积面数据shp格式 无偏移坐标&#xff0c;只…...

llama.cpp LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK2

llama.cpp LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK2 1. LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK22. LLM_ARCH_DEEPSEEK and LLM_ARCH_DEEPSEEK23. struct ggml_cgraph * build_deepseek() and struct ggml_cgraph * build_deepseek2()References 不宜吹捧中国大语言模型的同…...

k8s简介,k8s环境搭建

目录 K8s简介环境搭建和准备工作修改主机名&#xff08;所有节点&#xff09;配置静态IP&#xff08;所有节点&#xff09;关闭防火墙和seLinux&#xff0c;清除iptables规则&#xff08;所有节点&#xff09;关闭交换分区&#xff08;所有节点&#xff09;修改/etc/hosts文件&…...

2024年个人总结

序 照例&#xff0c;每年都有的个人年度总结来了&#xff0c;看了很多其他大佬的总结&#xff0c;感觉自己的2024过于单薄&#xff0c;故事也不太丰满&#xff0c;自己就回去比较&#xff0c;自己哪里做的不好 &#xff1f;但后来发现已经进入了一个思维误区。 年度总结年度总结…...

【落羽的落羽 数据结构篇】顺序表

文章目录 一、线性表二、顺序表1. 概念与分类2. 准备工作3. 静态顺序表4. 动态顺序表4.1 定义顺序表结构4.2 顺序表的初始化4.3 检查空间是否足够4.3 尾部插入数据4.4 头部插入数据4.5 尾部删除数据4.6 头部删除数据4.7 在指定位置插入数据4.8 在指定位置删除数据4.9 顺序表的销…...

麒麟操作系统服务架构保姆级教程(十四)iptables防火墙四表五链和防火墙应用案例

如果你想拥有你从未拥有过的东西&#xff0c;那么你必须去做你从未做过的事情 防火墙在运维工作中有着不可或缺的重要性。首先&#xff0c;它是保障网络安全的关键防线&#xff0c;通过设置访问控制规则&#xff0c;可精准过滤非法网络流量&#xff0c;有效阻挡外部黑客攻击、恶…...

Linux之详谈——权限管理

目录 小 峰 编 程 ​编辑 一、权限概述 1、什么是权限 2、为什么要设置权限 3、Linux中的权限类别- 4、Linux中文件所有者 1&#xff09;所有者分类&#xff08;谁&#xff09; 2&#xff09;所有者的表示方法 ① u(the user who owns it)&#xff08;属主权限&…...