《Spring Guides系列学习》guide1 - guide5

news2024/12/28 2:30:11

要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。
在这里插入图片描述
开始吧,自己按照顺序给每篇Guide编了号。

guide1、Building a restful web service

主要讲的是如何创建一个restful web服务,每篇guide里还提供了示例代码,可以自己git clone下来看看,当然每篇guide只是介绍了Spring的一个点,因此代码也不复杂,自己动手写也很快。

核心代码是编写一个Controller,启动程序后,可以根据路径直接访问接口。


@RestController
public class GreetingController {

	private static final String template = "Hello, %s!";
	private final AtomicLong counter = new AtomicLong();

	@GetMapping("/greeting")
	public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) {
		return new Greeting(counter.incrementAndGet(), String.format(template, name));
	}
}

Guide涉及注解:

@RestController: spring4.0引入该注解以简化restful web服务的创建。相当于@Controller + @ResponseBody注解。


@Controller注解是@Component的注解的一种特殊化,被用来注解controller类,该类可以接收HTTP请求。


@ResponseBody, 使用后将返回对象自动序列化到HttpResponse中。

如果需要返回内容,例如json数据,@RestController自己就可以,@Controller需要和@ResponseBody搭配才行。


@Component注解,可以让 Spring 自动检测使用该注解的bean。
Spring 将:
扫描应用程序以查找使用@Component注解的类
实例化它们并将任何指定的依赖项注入其中
在需要的地方注入它们


@requestMapping注解:简单讲,就是将web请求映射到spring controller的方法上。
value参数是指定的映射路径地址,method参数代表的是请求类型,headers代表的是指定的请求头信息。示例代码:

@RequestMapping(value = "/ex/foos", headers = "key=val", method = GET)
@ResponseBody
public String getFoosWithHeader() {
    return "Get some Foos with Header";
}

spring 4.3引入了其他的几个新http映射注解,都是基于@requestMapping的。
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

这五个注解分别用来处理不同类型的http请求。


@PathVariable()注解:用来映射URL中绑定的占位符。如果参数名称与路径变量名称匹配,可以变为:@PathVariable long id。示例代码:

@RequestMapping(value = "/ex/foos/{id}", method = GET)
@ResponseBody
public String getFoosBySimplePathWithPathVariable(@PathVariable("id") long id)
   {
    return "Get a specific Foo with id=" + id;
}

@requestParam注解用来映射url参数, 如下例,从而获取id参数。可以用name属性或者value属性配置参数名称。以及require属性标记该参数是否被需要。defaultValue参数提供默认值。示例代码:

@RequestMapping(value = "/ex/bars", method = GET)
@ResponseBody
public String getBarBySimplePathWithRequestParam(@RequestParam("id") long id)
   {
    return "Get a specific Bar with id=" + id;
}

@requestBody 注释将HttpRequest body自动反序列化到 Java 对象上。一般是用来处理content-type为application/json的类型。

在这里插入图片描述
注意点:
GET方式无请求体,所以使用@RequestBody接收数据时,前端不能使用GET方式提交数据,需要用POST方式进行提交。在后端的同一个接收方法里,@RequestBody与@RequestParam()可以同时使用,@RequestBody最多只能有一个,而@RequestParam()可以有多个。


@SpringBootApplication:使用这个注解来标记 Spring Boot 应用程序的主类。并且@SpringBootApplication封装了@Configuration、 @EnableAutoConfiguration和**@ComponentScan注解及其默认属性。

@Configuration该注解表示一个类声明了一个或多个拥有 @Bean注解的方法,并且这些拥有 @Bean的方法的返回对象将被 Spring 容器管理,在其他类中就可以使用 @Autowired注解注入这些 Bean。

@EnableAutoConfiguration 注解表示开启自动配置功能。意味着spring boot在类路径上寻找自动配置的bean并自动运用它。

@ComponentScan 注解其实很简单,它主要就是定义扫描的包路径,然后从中找出标识了需要装配的类自动装配到Spring的Bean容器。


guide2、consuming a restful web service

主要讲的是如何利用restTemplate发请求,并获取接口返回数据。

Guide涉及注解:
@JsonIgnoreProperties:忽略类中不存在的字段;也可以指定要忽略的字段。参数ignoreUnknown:该属性定义在反序列化期间是否可以忽略任何无法识别的字段。

举例:

@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public class Request {
    private String deviceName;
    private String deviceType;
}

在类上加了该注解,如果该Request类是后台接收的实体类。且接收到的序列化json

{
  "deviceName": "xxx",
  "deviceType": "xxx",
  "devicePower": 120
}

加上该注解后,因为devicePower在类中不存在,所以反序列化时会忽略该字段。

@JsonProperty:此注解用于实体类的属性上,功能是把属性名称转换为另一个名称。

import com.fasterxml.jackson.annotation.JsonProperty; 
public class Student { 
    @JsonProperty("name") 
    private String trueName; 
} 

CommandLineRunner:项目启动之后就立即执行的操作

@Bean
    public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
        return args -> {
            Quote quote = restTemplate.getForObject(
                    "http://localhost:8080/api/random", Quote.class);
            log.info(quote.toString());
        };
    }

如果有多个类实现CommandLineRunner接口类,如果需要按照一定的顺序去执行,那么就需要在实体类上使用一个@Order注解(或者实现Order接口)来表明顺序。

guide3、building java project with maven

讲的是如何用maven创建java项目。
主要是pom.xml文件,定义了maven项目的名称、版本和对外部库的依赖等。
以及maven的生命周期,使用mvn compile 、mvn package、mvn install进行编译、打包、打包到本地依赖库等。Guide只是简单介绍下用maven创建项目。


详细了解Maven可以直接去Maven官网。 https://maven.apache.org/

guide4、upload file

主要讲的是如何上传文件, 关键是Path类与Files类。

java.nio.file.Path类:Java Path实例表示文件系统中的路径。路径可以指向文件或目录。路径可以是绝对的或相对的。
1、创建Path实例:

// 可以在Paths类(java.nio.file.Paths)中使用静态方法创建Path实例。
 Path path = Paths.get("c:\\data\\myfile.txt");

2、File、Path、URI之间的转换:

 File file = new File("C:/my.ini");
 Path path = file.toPath();
 path.toFile();
 file.toURI();

java.nio.file.Files类:
guide里演示的文件上传其实就是使用了:

--文件的复制,将文件输入流中的数据复制到path里。
Files.copy(InputStream in, Path target, CopyOption... options)

Files还提供的有其他api等等

--创建目录
createDirectory(Path dir, FileAttribute<?>... attrs)
--创建文件
createFile(Path path, FileAttribute<?>... attrs)

顺便扩展工作中遇到的相关知识:

file的输入输出流:https://blog.csdn.net/Steriles_/article/details/82800245

BASE64与图片互转的代码:https://note.youdao.com/s/AnIZafUY


Guide涉及注解:

@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中,不需要再在applicationContext.xml文件定义bean了。


@ConfigurationProperties注解:
在 SpringBoot 中,当想需要获取到配置文件数据时,除了可以用 Spring 自带的 @Value 注解外,SpringBoot 还提供了一种更加方便的方式:@ConfigurationProperties。只要在 Bean 上添加上了这个注解,指定好配置文件的前缀,那么对应的配置文件数据就会自动填充到 Bean 中。
比如在application.properties文件中有如下配置文件

config.username=jay.zhou
config.password=3333

那么按照如下注解配置,SpringBoot项目中使用@ConfigurationProperties的Bean,它的username与password就会被自动注入值了。就像下面展示的那样

@Component
@ConfigurationProperties(prefix = "config")
public class TestBean{
    private String username;
    private String password;
}

@value注解:是将配置文件的属性读出来,这就是读取配置项中的spring.port属性

@Value("${spring.port}")
private String port;

@EnableConfigurationProperties注解的作用是:使用了 @ConfigurationProperties 注解的类生效。一般用在启动类上, 如下:

@SpringBootApplication
@EnableConfigurationProperties(StorageProperties.class)
public class UploadingFilesApplication {
   public static void main(String[] args) {
      SpringApplication.run(UploadingFilesApplication.class, args);
   }
}

如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component,那么在IOC容器中是获取不到properties 配置文件转化的bean。说白了 @EnableConfigurationProperties 相当于把使用 @ConfigurationProperties 的类进行了一次注入。

guide5、Messaging with Redis

这篇guide主要讲的是简单使用redis去发布和订阅消息。
redis不仅提供一个noSql数据存储,还提供了一个消息传递系统。虽然平常工作一般只是拿Redis去做缓存,提高访问数据的速度。但是Guide这里也介绍了如何用Redis去发消息。

1、先定义一个消息接收者。
简单创建一个具有响应消息方法的接收器。如下,这
Receiver是一个 POJO,它定义了接收消息的方法 receiveMessage。

public class Receiver {
    private static final Logger LOGGER = LoggerFactory.getLogger(Receiver.class);
    private AtomicInteger counter = new AtomicInteger();
    public void receiveMessage(String message) {
        LOGGER.info("Received <" + message + ">");
        int i = counter.incrementAndGet();
        System.out.println(i);
    }
    public int getCount() {
        return counter.get();
    }
}

2、注册监听器并发送消息
spring data reids 提供了使用redis发送和接收消息所需的所有组件。具体需要配置:

  • 连接工厂
  • 一个消息监听器容器
  • 一个 Redis 模板
@SpringBootApplication
public class MessagingRedisApplication {

    private static final Logger LOGGER = LoggerFactory.getLogger(MessagingRedisApplication.class);

	@Bean
    RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter) {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listenerAdapter, new PatternTopic("chat"));

        return container;
    }

--因为Receiver是一个POJO,所以需要去包装为一个消息监听适配器MessageListenerAdapter。
消息侦听器适配器还配置为在消息到达时调用该receiveMessage()方法。
    @Bean
    MessageListenerAdapter listenerAdapter(Receiver receiver) {
        return new MessageListenerAdapter(receiver, "receiveMessage");
    }

    @Bean
    Receiver receiver() {
        return new Receiver();
    }

    @Bean
    StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
        return new StringRedisTemplate(connectionFactory);
    }

    public static void main(String[] args) throws InterruptedException {

        ApplicationContext ctx = SpringApplication.run(MessagingRedisApplication.class, args);

        StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);
        Receiver receiver = ctx.getBean(Receiver.class);

        while (receiver.getCount() == 0) {

            LOGGER.info("Sending message...");
            template.convertAndSend("chat", "Hello from Redis!");
            Thread.sleep(500L);
        }

        System.exit(0);
    }
}

在main方法中,通过创建spring应用程序上下文来启动所有操作。应用程序上下文启动消息监听容器,receiver bean开始侦听消息。

然后在应用程序上下文中启动stringTenplate bean并使用它发送主题chat的消息Hello from Redis!。

运行结果:

2023-04-23 12:57:12.848  INFO 35396 --- [           main] c.e.m.MessagingRedisApplication          : Started MessagingRedisApplication in 1.511 seconds (JVM running for 3.685)
2019-04-23 12:57:12.849  INFO 35396 --- [           main] c.e.m.MessagingRedisApplication          : Sending message...
2019-04-23 12:57:12.861  INFO 35396 --- [    container-2] com.example.messagingredis.Receiver      : Received <Hello from Redis!>
    

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

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

相关文章

UDP就一定比TCP快吗?

前言 话说&#xff0c;UDP比TCP快吗&#xff1f; 相信就算不是八股文老手&#xff0c;也会下意识的脱口而出&#xff1a;”是“。 但这也让人好奇&#xff0c;用UDP就一定比用TCP快吗&#xff1f;什么情况下用UDP会比用TCP慢&#xff1f; 我们今天就来聊下这个话题。 使用…

关于使用--- pyinstaller---无法打包py文件为exe的问题集合

目录 安装 pyinstaller 问题1&#xff1a; 解决办法&#xff1a; CMD中输入 问题2&#xff1a; 解决办法&#xff1a; CMD中输入 问题3&#xff1a; 将py文件打包成exe中&#xff0c;需要按照如下在CMD中输入 PyInstaller介绍 PyInstaller是一个Python库&#xff0c;可以…

智慧档案馆八防是怎么建设的?都需要注意哪些内容

智慧档案馆八防环境监控系统一体化解决系统方案 智慧档案库房一体化平台通过智慧档案管理&#xff0c;实现智慧档案感知协同处置功能&#xff1b;实现对档案实体的智能化识别、定位、跟踪监控&#xff1b;实现对档案至智能密集架、空气恒湿净化一体设备、安防设备&#xff0c…

基于java用队列实现栈

基于java用队列实现栈 问题描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int …

C++第六章:函数

函数 一、函数基础1.0 简介形参和实参形参列表函数的返回类型 1.1 局部对象自动对象局部静态对象 1.2 函数声明在头文件中进行函数声明 1.3 分离式编译编译和链接多个源文件 二、参数传递2.1 传值参数指针形参 2.2 传引用参数使用形参返回额外信息 2.3 const形参和实参指针或引…

「实在RPA·人社数字员工」促进人力社保数字办公战略转型

一、人力社保部门数字化转型的重要性 伴随着国家放宽人力资源市场准入条例&#xff0c;多次出台相关扶持政策&#xff0c;市场竞争加剧&#xff0c;后疫情时代格局的大变局&#xff0c;如何提高服务质量和效率&#xff0c;如何降本增效&#xff0c;成为人力资源和社会保障行业…

【算法】不使用LinkedHashMap实现一个LRU缓存

文章目录 什么是LRU&#xff1f;设计思路代码实现 LRU是我在面试过程中遇到的比较多的算法题了&#xff0c;并且我自己的项目中也手写了LRU算法&#xff0c;所以觉得还是有必要掌握一下这个重要的算法的。 什么是LRU&#xff1f; LRU是一种缓存淘汰策略。 我们知道&#xff0…

经典文献阅读之--PIBT(基于可见树的实时规划方案)

0. 简介 作为路径规划而言&#xff0c;不单单有单个机器人自主路径规划&#xff0c;近年来随着机器人行业的兴起&#xff0c;多机器人自主路径规划也越来越受到关注&#xff0c;对于多智能体寻路(MAPF)。一般的操作会给定一个地图、机器人集群、以及它们的初始位置和目的地&am…

IP地址分配与释放

IP 分配我们平时应该接触比较少。还记得在大学的时候&#xff0c;刚入学第一件事就是赶紧交网费。交网费时会有一个步骤&#xff0c;网管会让你提供 MAC 地址&#xff0c;然后把 IP 地址和 MAC 地址绑定&#xff0c;这也就是博主在隔壁宿舍无法通过网线上网的原因。 其实&#…

如何在华为OD机试中获得满分?Java实现【寻找相似单词】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

[已解决] 决定系数R2为何为负 from sklearn.metrics import r2_score

最近在炼丹发现一件很有趣的现象&#xff0c;决定系数R2竟然为负&#xff0c;小学生都知道任何一个常数的平方绝不可能为负&#xff0c;潜意识里告诉我这里面必有蹊跷&#xff0c;因此查阅许多资料得知&#xff0c;决定系数R2不是r相关系数的平方这么简单&#xff0c;实际上当非…

加密后的敏感字段还能进行模糊查询吗?该如何实现?

前言 有一个问题不知道大家想过没&#xff1f;敏感字段数据是加密存储在数据库的表中&#xff0c;如果需要对这些敏感字段进行模模糊查询&#xff0c;还用原来的通过sql的where从句的like来模糊查询的方式肯定是不行的&#xff0c;那么应该怎么实现呢&#xff1f;这篇文章就来…

zigbee 串行通信

串口通信需要三个函数 // Initialize UART at the startup //------------------------------------------------------------------- void halUartInit(uint32 baud);//------------------------------------------------------------------- // Read a buffer from the UART …

MySQL 的锁

目录 一、锁的分类 二、全局锁、表级锁、页级锁、行级锁 三、乐观锁和悲观锁 四、共享锁和排它锁 五、意向共享锁和意向排它锁 六、间隙锁、临键锁、记录锁 锁的分类和用途 一、锁的分类 1、MySQL锁可以按模式分类为&#xff1a; 乐观锁悲观锁。 2、按粒度分可以分为&a…

【2023 · CANN训练营第一季】MindSpore模型快速调优攻略 第三章——MindSpore云上调试调优

1.ModelArts云上调试调优 ModelArts密钥初始化 详细教程&#xff1a; 初始化OBS服务 创建训练作业 2.MindSpore IDE插件效率提升 通过智能代码块推荐、代码自动补全等特性&#xff0c;提升MindSpore脚本开发效率&#xff0c;对接ModelArts云服务&#xff0c;实现模型训…

龙芯2K1000实战开发-时钟设计

文章目录 概要整体架构流程技术名词解释技术细节小结概要 提示:这里可以添加技术概要 本文主要结合项目方案,结合相应外设需求,设计单板时钟方案 整体架构流程 提示:这里可以添加技术整体架构 整体单板时钟方案,分为两部分。 一部分是:以CPU为核心,包括自身一些控…

VR全景智慧城市:构筑未来城市的数字化大融合

引言&#xff1a; 现代城市正处于数字化时代的浪潮之中&#xff0c;而在这个数字化浪潮中&#xff0c;VR全景智慧城市正以令人瞩目的方式崭露头角。随着虚拟现实&#xff08;VR&#xff09;技术的不断进步和智慧城市的发展需求&#xff0c;VR全景智慧城市作为数字技术与城市发展…

openGauss Developer Day 2023 | 邀您参加海量数据分论坛

尊敬的数据库开发者 &#xff1a; 海量数据 已为您备好一封通往数智时代的邀请函&#xff0c;请您于 5月26日 前往北京昆泰嘉瑞文化中心&#xff0c;赶赴 openGauss Developer Day 2023 的盛大约定。 本次专场活动中&#xff0c;海量数据将会轮番为您展示最核心的技术…

chatgpt赋能python:Python二次方的表示方法及其应用

Python 二次方的表示方法及其应用 介绍 Python是一种优雅、简洁、易学的编程语言&#xff0c;很多程序员选择使用Python开发各种应用。在计算机科学中&#xff0c;二次方&#xff08;也称为平方&#xff09;非常常见。在Python中&#xff0c;我们有多种方法来表示二次方。 平…

C Primer Plus第六章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.编写一个程序&#xff0c;创建一个包…