SpringMVC中的自定义注解

目录

 简介

注解(Annotation)在Java编程中的作用

SpringMVC中的自定义注解

Java注解是什么?

为什么在Java开发中注解变得如此重要?

Java注解分类

1. 标准注解(JDK基本注解)

2. 自定义注解

JDK基本注解

JDK元注解

自定义注解

如何使用自定义注解?

案例1:获取类与方法上的注解值

 案例二:获取类属性上的注解属性值

示例三:获取参数修饰注解对应的属性值

Aop自定义注解的应用  

 MyLog自定义注解类

MyLogAspect切面类

controller层



 简介

注解(Annotation)在Java编程中的作用

在Java编程中,注解(Annotation)是一种元数据(metadata)标记,它们提供了对程序元素(如类、方法、字段等)的额外信息。注解通常不直接影响程序的运行,但它们可以被编译器、开发工具和框架等工具利用,以提供更多的语义信息和指导程序的行为。

以下是注解在Java编程中的一些重要作用:

  1. 提供元数据信息:注解可以附加元数据信息到程序元素上。例如,你可以使用注解来标记一个类是否是一个实体类,或者一个方法是否需要事务管理。这些元数据可以在运行时被读取和处理。

  2. 编译时检查:注解可以被编译器用来检查代码的正确性。例如,@Override注解用于标识子类中的方法覆盖了父类的方法,编译器可以检查是否满足覆盖的条件,如果不满足,则会报错。

  3. 代码生成:许多框架和工具可以根据注解生成代码。例如,JavaEE框架中的JPA(Java Persistence API)可以根据实体类上的注解自动生成数据库表结构。

  4. 文档生成:注解可以用于生成文档。通过工具如Javadoc,你可以使用注解来为类、方法和字段添加描述性信息,这些信息将生成到文档中,帮助其他开发人员理解代码的含义和用法。

  5. 运行时处理:在运行时,可以使用反射机制来读取和处理注解。这使得你能够根据注解的信息来调整程序的行为。例如,Spring框架中的依赖注入就是基于运行时处理注解的一个典型示例。

  6. 框架扩展:注解使得框架能够更加灵活和可扩展。开发者可以使用注解来扩展框架的功能,而不需要修改框架的源代码。

注解为Java编程带来了更多的灵活性、可读性和可维护性。它们是现代Java编程中不可或缺的一部分,被广泛用于各种领域,从基础的语法检查到大规模应用程序的开发和维护。

SpringMVC中的自定义注解

在SpringMVC中,自定义注解是一种非常有用的工具,它们可以帮助开发者更好地管理和控制Web应用程序的行为。以下是关于SpringMVC中自定义注解的重要性和用途的说明:

1. 控制器映射

  • 重要性:自定义注解可以用于标记控制器类或方法,以定义请求的映射规则,将HTTP请求与相应的控制器方法关联起来。

  • 用途:通过自定义注解,你可以创建自己的路由规则,以便更清晰地定义URL到控制器方法的映射。这样可以提高代码的可读性和维护性。

2. 参数验证和绑定
  • 重要性:自定义注解可以用于验证和绑定请求参数,确保它们满足特定的条件和格式。

  • 用途:通过自定义注解,你可以在方法参数上添加验证规则,例如校验参数是否为正整数或非空。这有助于保持控制器方法的干净和规范。

3. 安全性

  • 重要性:自定义注解可以用于实施安全性控制,限制特定用户或角色的访问权限。

  • 用途:通过自定义注解,你可以标记需要身份验证或授权的控制器方法,以确保只有授权用户可以访问敏感资源。

4. 日志记录
  • 重要性:自定义注解可以用于记录方法的执行,以便进行调试和审计。

  • 用途:通过自定义注解,你可以将方法的执行情况记录到日志中,包括方法的参数、返回值等信息,以便更容易诊断问题。

5. 自定义业务逻辑
  • 重要性:自定义注解可以用于标记特定的业务逻辑或行为。

  • 用途:通过自定义注解,你可以实现自己的业务规则,例如标记某个方法需要执行特殊的处理逻辑,或者标记方法作为事务边界。

总之,SpringMVC中的自定义注解是强大的工具,可以帮助开发者更好地组织、管理和控制Web应用程序的行为。它们提供了一种清晰、可扩展和可维护的方式来定义请求映射、参数验证、安全性、日志记录以及自定义业务逻辑。通过合理使用自定义注解,你可以提高代码的可读性,减少重复性代码,以及更好地满足项目的需求。

Java注解是什么?

Java注解是Java语言的一种特殊类型的元数据,它们可以在Java代码中通过注解标记程序的元素,如类、方法、变量等,以提供额外的信息。注解以 @ 符号为前缀,可以携带一些参数,用于描述被注解的元素的性质、特征或约束。

Java注解的声明形式类似于接口,但它们使用关键字 @interface 定义。注解可以包含元素,这些元素可以是基本类型、枚举、类、数组等类型。

为什么在Java开发中注解变得如此重要?

Java注解变得重要的原因有几个:

  1. 元数据标记和描述性信息:注解提供了一种在源代码中添加元数据和描述性信息的简单方式,可以用于描述程序元素的属性、特征和约束。

  2. 编译时检查和工具处理:注解可以用于编写编译时检查的规则,或者为开发工具提供信息。通过注解,可以实现更严格的代码检查,发现潜在的错误和问题。

  3. 代码生成和自动化:许多框架和工具可以根据注解生成代码,简化开发流程。例如,ORM(Object-Relational Mapping)框架可以根据实体类上的注解自动生成数据库映射。

  4. 框架和库的集成:注解可以用于框架和库中,使开发者可以通过简单的注解配置来定制框架或库的行为。这种可扩展性和灵活性使得开发更加高效和便捷。

  5. 元编程和反射:注解可以在运行时通过反射获取,使得程序可以根据注解信息动态地执行特定逻辑。这种特性为元编程提供了基础。

总的来说,Java注解为Java开发提供了一种强大的机制,可以帮助开发者更好地组织、描述、扩展和自动化代码。它们是现代Java开发中的重要工具,广泛用于各种框架、库和应用程序的开发和维护中。

提供一些常见的Java注解示例,如@Override@Deprecated等。

Java注解分类

Java注解可以分为两大类:标准注解(JDK基本注解)和自定义注解。下面将对这两大类注解进行分类介绍。

1. 标准注解(JDK基本注解)

这些注解是Java语言自身提供的,用于标记和控制程序的行为。它们通常被广泛用于编写Java类、方法和字段,并由Java编译器、IDE和其他工具识别和处理。

(1) @Override

  • 用途:用于标记子类中的方法覆盖了父类的方法。它可以帮助编译器检查方法是否正确地覆盖了父类方法。

(2) @Deprecated

  • 用途:用于标记类、方法或字段已经不推荐使用,通常因为它们已经过时或有更好的替代方案。

(3) @SuppressWarnings

  • 用途:用于抑制编译器生成的警告信息,通常用于临时禁用某些警告。

(4) @FunctionalInterface

  • 用途:用于标记接口是一个函数式接口,即只有一个抽象方法,可以用于Lambda表达式。

(5) @SafeVarargs

  • 用途:用于标记方法是安全的可变参数方法,可以抑制相关警告。

(6) @SuppressWarnings("serial")

  • 用途:用于抑制编译器生成的关于缺少序列化ID的警告。

2. 自定义注解

自定义注解是开发者根据自己的需求创建的注解,用于标记和控制程序的行为。自定义注解通常用于框架、库和应用程序的开发,以提供额外的元数据信息和控制逻辑。

(1) 用途相关的自定义注解

  • 这类注解根据应用的需要,可以用于标记特定的业务逻辑,如事务控制、日志记录、权限检查等。

(2) 参数验证的自定义注解

  • 这类注解可以用于标记方法参数,以进行参数的验证和约束,如@NonNull、@NotBlank、@Positive等。

(3) 自定义路由和映射注解

  • 这类注解可以用于标记控制器类和方法,自定义请求的映射规则,如SpringMVC中的@RequestMapping、@GetMapping等。

(4) 框架和库特定的自定义注解

  • 许多框架和库会定义自己的自定义注解,用于控制其行为和配置,如Spring框架中的@Transactional、@Component等。

自定义注解使得开发者能够根据具体需求来扩展和增强Java程序的功能,提供了更高的灵活性和可定制性。它们通常需要开发者定义注解的结构和处理逻辑,以适应特定的应用场景。

详细讨论标准注解,如@Override@Deprecated@SuppressWarnings等,以及它们的用途。

JDK基本注解

  • JDK基本注解是Java开发工具包(JDK)中提供的一组预定义注解,用于标记代码的特定元素。这些注解包括:

    @Override:用于标记方法覆盖(重写)父类中的方法。当一个方法使用了该注解时,编译器会检查该方法是否正确地覆盖了父类中的方法。
    @Deprecated:用于标记已过时的方法、类或字段。当一个方法或类被标记为过时时,编译器会发出警告,提醒开发者不再推荐使用该方法或类。
    @SuppressWarnings:用于抑制编译器产生的警告信息。可以在方法、类或整个代码块上使用该注解,以忽略特定类型的警告。

JDK元注解

  • 什么是元注解?

元注解是用于注解其他注解的注解。换句话说,元注解是一种特殊类型的注解,它们用于对其他注解进行说明、配置和控制。元注解在Java中扮演着非常重要的角色,因为它们允许开发者自定义注解的行为和语义,从而满足特定需求。

在Java中,有一些内置的元注解,它们用于注解的声明和使用。以下是一些常见的元注解:

  1. @Retention:用于指定注解的保留策略,即注解在编译时、运行时或者仅在源代码中保留。保留策略包括RetentionPolicy.SOURCERetentionPolicy.CLASSRetentionPolicy.RUNTIME

  2. @Target:用于指定注解可以应用的目标元素类型,如类、方法、字段、参数等。目标类型包括ElementType.TYPEElementType.METHODElementType.FIELD等。

  3. @Documented:用于指定注解是否包含在Java文档中。如果一个注解被标记为@Documented,则它的文档信息将包括在生成的文档中。

  4. @Inherited:用于指定注解是否可以被继承。如果一个注解被标记为@Inherited,则它可以被子类继承。

这些元注解在自定义注解中起着关键作用,它们允许开发者控制注解的保留策略、目标元素类型、文档生成和继承性。通过选择合适的元注解,可以自定义注解的行为和语义,以满足具体的需求。

介绍JDK中的元注解,包括:

@Retention://定义注解的保留策略
@Retention(RetentionPolicy.SOURCE)             //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS)              //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME)            //注解会在class字节码文件中存在,在运行时可以通过反射获取到

@Target://指定被修饰的Annotation可以放置的位置(被修饰的目标)
@Target(ElementType.TYPE)                      //接口、类
@Target(ElementType.FIELD)                     //属性
@Target(ElementType.METHOD)                    //方法
@Target(ElementType.PARAMETER)                 //方法参数
@Target(ElementType.CONSTRUCTOR)               //构造函数
@Target(ElementType.LOCAL_VARIABLE)            //局部变量
@Target(ElementType.ANNOTATION_TYPE)           //注解
@Target(ElementType.PACKAGE)                   //包
//注:可以指定多个位置,例如:
@Target({ElementType.METHOD, ElementType.TYPE}),//也就是此注解可以在方法和类上面使用
@Inherited://指定被修饰的Annotation将具有继承性
@Documented://指定被修饰的该Annotation可以被javadoc工具提取成文档.

 

自定义注解

如何使用自定义注解?

案例1:获取类与方法上的注解值

MyAnnotation1

package com.liao.annotation;import java.lang.annotation.*;/*** MyAnnotation1注解可以用在类、接口、属性、方法上* 注解运行期也保留* 不可继承*/
@Target({ElementType.TYPE, ElementType.FIELD,ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation1 {String name();
}

 MyAnnotation2

package com.liao.annotation;import com.liao.model.TranscationModel;import java.lang.annotation.*;/***  MyAnnotation2注解可以用在方法上*  注解运行期也保留*  不可继承*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation2 {TranscationModel model() default TranscationModel.ReadWrite;
}

 MyAnnotation3

package com.liao.annotation;import com.l.model.TranscationModel;import java.lang.annotation.*;/*** MyAnnotation3注解可以用在方法上* 注解运行期也保留* 可继承*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface MyAnnotation3 {TranscationModel[] models() default TranscationModel.ReadWrite;
}

 Demo1测试类 : 获取类与方法上的注解值

package com.liao.annotation.demo;import com.liao.annotation.MyAnnotation1;
import com.liao.annotation.MyAnnotation2;
import com.liao.annotation.MyAnnotation3;
import com.liao.model.TranscationModel;/*** 获取类与方法上的注解值*/
@MyAnnotation1(name = "abc")
public class Demo1 {@MyAnnotation1(name = "xyz")private Integer age;@MyAnnotation2(model = TranscationModel.Read)public void list() {System.out.println("list");}@MyAnnotation3(models = {TranscationModel.Read, TranscationModel.Write})public void edit() {System.out.println("edit");}
}

 案例二:获取类属性上的注解属性值

TestAnnotation

package com.liao.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;//@Retention(RetentionPolicy.SOURCE)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TestAnnotation {String value() default "默认value值";String what() default "这里是默认的what属性对应的值";
}

测试类

package com.liao.annotation.demo2;import com.liao.annotation.TestAnnotation;/*** 获取类属性上的注解属性值*/
public class Demo2 {@TestAnnotation(value = "这就是value对应的值_msg1", what = "这就是what对应的值_msg1")private static String msg1;@TestAnnotation("这就是value对应的值1")private static String msg2;@TestAnnotation(value = "这就是value对应的值2")private static String msg3;@TestAnnotation(what = "这就是what对应的值")private static String msg4;
}

测试

package com.liao.annotation.demo2;import com.liao.annotation.TestAnnotation;
import org.junit.Test;public class Demo2Test {@Testpublic void test1() throws Exception {TestAnnotation msg1 = Demo2.class.getDeclaredField("msg1").getAnnotation(TestAnnotation.class);System.out.println(msg1.value());System.out.println(msg1.what());}@Testpublic void test2() throws Exception{TestAnnotation msg2 = Demo2.class.getDeclaredField("msg2").getAnnotation(TestAnnotation.class);System.out.println(msg2.value());System.out.println(msg2.what());}@Testpublic void test3() throws Exception{TestAnnotation msg3 = Demo2.class.getDeclaredField("msg3").getAnnotation(TestAnnotation.class);System.out.println(msg3.value());System.out.println(msg3.what());}@Testpublic void test4() throws Exception{TestAnnotation msg4 = Demo2.class.getDeclaredField("msg4").getAnnotation(TestAnnotation.class);System.out.println(msg4.value());System.out.println(msg4.what());}
}

示例三:获取参数修饰注解对应的属性值

IsNotNull自定义注解

package com.liao.annotation;import java.lang.annotation.*;/*** 非空注解:使用在方法的参数上,false表示此参数可以为空,true不能为空*/
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface IsNotNull {boolean value() default false;
}

 测试:

package com.liao.annotation.demo3;import com.liao.annotation.IsNotNull;/*** 获取参数修饰注解对应的属性值*/
public class Demo3 {public void hello1(@IsNotNull(true) String name) {System.out.println("hello:" + name);}public void hello2(@IsNotNull String name) {System.out.println("hello:" + name);}
}

package com.liao.annotation.demo3;import com.liao.annotation.IsNotNull;
import org.junit.Test;import java.lang.reflect.Method;
import java.lang.reflect.Parameter;public class Demo3Test {@Testpublic void hello1() throws Exception {Demo3 demo3 = new Demo3();for (Parameter parameter : demo3.getClass().getMethod("hello1", String.class).getParameters()) {IsNotNull annotation = parameter.getAnnotation(IsNotNull.class);if(annotation != null){System.out.println(annotation.value());//true}}}@Testpublic void hello2() throws Exception {Demo3 demo3 = new Demo3();for (Parameter parameter : demo3.getClass().getMethod("hello2", String.class).getParameters()) {IsNotNull annotation = parameter.getAnnotation(IsNotNull.class);if(annotation != null){System.out.println(annotation.value());//false}}}@Testpublic void hello3() throws Exception {
//        模拟浏览器传递到后台的参数 解读@requestParamString name = "zs";Demo3 demo3 = new Demo3();Method method = demo3.getClass().getMethod("hello1", String.class);for (Parameter parameter : method.getParameters()) {IsNotNull annotation = parameter.getAnnotation(IsNotNull.class);if(annotation != null){System.out.println(annotation.value());//trueif (annotation.value() && !"".equals(name)){method.invoke(demo3,name);}}}}
}

Aop自定义注解的应用  

 MyLog自定义注解类

package com.liao.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyLog {String desc();
}

MyLogAspect切面类

package com.liao.aspect;import com.liao.annotation.MyLog;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;@Component
@Aspect
public class MyLogAspect {private static final Logger logger = LoggerFactory.getLogger(MyLogAspect.class);/*** 只要用到了com.javaxl.p2.annotation.springAop.MyLog这个注解的,就是目标类*/@Pointcut("@annotation(com.liao.annotation.MyLog)")private void MyValid() {}@Before("MyValid()")public void before(JoinPoint joinPoint) {MethodSignature signature = (MethodSignature) joinPoint.getSignature();logger.debug("[" + signature.getName() + " : start.....]");System.out.println("[" + signature.getName() + " : start.....]");MyLog myLog = signature.getMethod().getAnnotation(MyLog.class);logger.debug("【目标对象方法被调用时候产生的日志,记录到日志表中】:"+myLog.desc());System.out.println("【目标对象方法被调用时候产生的日志,记录到日志表中】:" + myLog.desc());}
}

controller层

package com.liao.web;import com.liao.annotation.aop.MyLog;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class LogController {@RequestMapping("/mylog")@MyLog(desc = "这是结合spring aop知识,讲解自定义注解应用的一个案例")public void testLogAspect(){System.out.println("记录日志。。。");}
}

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

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

相关文章

项目基本搭建流程

一.分层 二.使用generator 来自动建立实体类dao 和dao接口,存放sql文件的xml;并复制到项目中(路径可能可以直接设置) 三. 配置文件:a。jdbc.properties :jdbc 链接数据库 1.url 2.username 3.password b。spring…

Ascend_PyTorch安装指北

Ascend_PyTorch安装指北 主要分为以下几步: 升级固件和驱动;安装CANN包toolkit;安装torch-1.11;安装apex;安装deepspeed; 升级固件和驱动 固件版本为:Ascend-hdk-910-npu-firmware_6.3.0.1.…

Cesium 地球(2)-瓦片创建

Cesium 地球(2)-瓦片创建 QuadtreePrimitive代码执行4个步骤: step1: update()step2: beginFrame()step3: render()step4: endFrame() 但并不是瓦片的创建步骤。 1、创建 QuadtreeTile 基于 step3: render() step3: render()┖ selectTilesForRendering()在 selectTilesFo…

laravel框架 - 安装初步使用学习 composer安装

一、什么是laravel框架 Laravel框架可以开发各种不同类型的项目,内容管理系统(Content Management System,CMS)是一种比较典型的项目,常见的网站类型(如门户、新闻、博客、文章等)都可以利用CM…

LLM系列 | 20 : Llama2 实战(下篇)-中文语料微调(附完整代码)

简介 紧接前文: 万字长文细说ChatGPT的前世今生Llama 2实战(上篇):本地部署(附代码) 上篇主要介绍Llama2的基本情况和基于官方模型实测Llama2在中英上的效果,包括单轮和多轮对话。今天这篇小作文作为Llama2的下篇,主要介绍如何用中文语料对…

Linux中软链接与硬链接的作用、区别、创建、删除

1、软链接与硬链接的作用 (1)软链接 软链接是Linux中常用的命令,它的功能是某一文件在另外一个位置建立一个同步的链接,相当于C语言中的指针,建立的链接直接指向源文件所在的地址,软链接不会另外占用资源,当同一文件需要在多个位置被用到的时候,就会使用到软连接。 …

Python解析MDX词典数据并保存到Excel

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 察纳雅言,深追先帝遗诏,臣不胜受恩感激。 原始数据和处理结果: https://gitcode.net/as604049322/blog_data/-/tree…

DBus笔记

包含2套总线:system bus,service bus,权限不同,system bus需要kernel或root权限dbus daemon进程提供服务, 有systemd启动dbus daemon,为system bus和service bus分别启动一个daemon。native object&#xf…

【Unity插件】实现多人在线游戏——Mirror插件的使用介绍

文章目录 前言导入Mirror插件 简单介绍一、RPC调用二、错误注意 基本使用一、创建场景的网络管理器二、创建一个玩家三、添加玩家初始生成位置四、玩家控制五、同步摄像机六、同步不同角色的名字和颜色修改七、同步动画八、同步子弹方法一方法二 九、聊天功能十、场景同步切换十…

新版kafka可视化界面组件

二、安装kafka可视化客户端工具(kafka tool 2) 1、下载安装 在官网中找到对应自己电脑系统的版本: kafka Tool2官网下载地址: Offset Explorer 这个方案是为Kafka依赖zookeeper提供的可视化解决方案。 前言 在早期使用kafka的…

Flask-flask中的后台分页查询实现

在后台查询数据并在前台展示的场景中,当数据量较大时,页面加载会非常缓慢,此时建议使用后台分页查询的形式。在flask中,基于Flask-SQLAlchemy可以使用以下方式实现。 方法一: Flask-SQLAlchemy 提供了一个 paginate(…

现代循环神经网络-门控循环单元(GRU)

理论 门控隐状态 门控循环单元与普通的循环神经网络之间的关键区别在于: 前者支持隐状态的门控。 这意味着模型有专门的机制来确定应该何时更新隐状态, 以及应该何时重置隐状态。 这些机制是可学习的,并且能够解决了上面列出的问题。 例如&…

双目立体视觉

#理想模型图 其中: b 为基线,即两个相机原点之间的距离 ; fl和fr 分别为左右相机的焦距,理想的双目相机flfrf ; cl和cr 分别为左右相机的光心,理想的双目相机clcr ; xl和xr 分别为空间中的一点…

2023/09/15 qt day1

代码实现图形化界面 #include "denglu.h" #include "ui_denglu.h" #include <QDebug> #include <QIcon> #include <QLabel> #include <QLineEdit> #include <QPushButton> denglu::denglu(QWidget *parent): QMainWindow(p…

【AI】机器学习——支持向量机(非线性及分析)

5. 支持向量机(线性SVM) 文章目录 5.4 非线性可分SVM5.4.1 非线性可分问题处理思路核技巧核函数特点 核函数作用于SVM 5.4.2 正定核函数由 K ( x , z ) K(x,z) K(x,z) 构造 H \mathcal{H} H 空间步骤 常用核函数 5.5 SVM参数求解算法5.6 SVM与线性模型关系 5.4 非线性可分SVM …

Spark SQL【基于泰坦尼克号生还数据的 Spark 数据分析处理】

前言 昨天实验课试着做了一个 Spark SQL 小案例&#xff0c;发现好多内容还是没有掌握&#xff0c;以及好多书上没有的内容需要学习。 一、数据准备 csv 文件内容部分数据展示&#xff1a; PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarke…

聊天机器人

收集窗帘相关的数据 可以用gpt生成&#xff0c;也可以用爬虫 图形化界面 gradio 向量数据库 faiss python代码 import gradio as gr import random import timefrom typing import Listfrom langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstor…

揭秘:WhatsApp的注册策略

WhatsApp账号的注册方式可以分为两种&#xff1a;实体卡注册和虚拟卡注册。实体卡注册是指使用个人手机卡完成注册&#xff0c;而虚拟卡注册则通过前面提到的对接平台来完成的。 账号注册问题一直是导致WhatsApp账号永久封禁的主要原因。由于WhatsApp广泛为群发获客等用途之一…

设计方法编写测试用例---思路分析

测一四年我在YX公司带测试团队&#xff0c;一个用例评审的会议上&#xff0c;一不小心超常发挥&#xff0c;结果卡在了一个用例设计方法上&#xff0c;印象非常深刻&#xff0c;当时的业务场景是支付方式的选择和优惠方案。 在后来的工作中&#xff0c;也曾几次遇到需要选择合…

Docker 安装

Docker 官网&#xff1a;Docker: Accelerated Container Application Development Docker Hub官网&#xff1a;https://hub.docker.com/ 前提说明 CentOS Docker 安装 前提条件 目前&#xff0c;CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上&…