SpringBoot SpringBoot 原理篇 2 自定义starter 2.2 IP计数业务功能开发【自定义starter】

news2024/11/30 10:28:59

SpringBoot

【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】

SpringBoot 原理篇

文章目录

      • SpringBoot
      • SpringBoot 原理篇
      • 2 自定义starter
        • 2.2 IP计数业务功能开发【自定义starter】
          • 2.2.1 大概看看别人的starter
          • 2.2.2 直接开干
          • 2.2.3 小结

2 自定义starter

2.2 IP计数业务功能开发【自定义starter】

2.2.1 大概看看别人的starter

在这里插入图片描述

命名虽然可以随便,但是还是尽量和人家的像一点

而且,这些starter 是分成两部分的

在这里插入图片描述

这里面好像没有功能,在上面的自动配置里面

在这里插入图片描述

org → … → data → redis

在这里插入图片描述

这里面就有它的自动配置类 了

先把坐标定义出来, 然后做了一个工程

看看MP 的

在这里插入图片描述

好像也是这样哈

【咱们就一个模块搞定,像druid 那样】

在这里插入图片描述

2.2.2 直接开干

创建一个全新的SpringBoot 工程模块

在这里插入图片描述

依赖都不勾

在这里插入图片描述

直接创建,上来先把SpringBoot 的版本改掉

在这里插入图片描述

OK, 一个全新的SpringBoot 工程

大概修改一下pom 文件

不要测试依赖、也不要maven 插件

在这里插入图片描述

把测试直接拿掉了,已经无意义了

在这里插入图片描述

在这里插入图片描述

OK,结构的空壳就起来了

【业务类】

先导入web 包

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

在这里插入图片描述

package cn.dingjiaxiong.service;

import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * ClassName: IpCountService
 * date: 2022/10/25 16:49
 *
 * @author DingJiaxiong
 */


public class IpCountService {

    private Map<String, Integer> ipCountMap = new HashMap<String, Integer>();

    @Autowired
    private HttpServletRequest httpServletRequest; //当前的request 对象的注入工作由使用当前starter的工程提供自动装配

    //调用这个方法,就可以统计ip的访问次数
    public void count() {
        System.out.println("==============================================");
        //每次调用当前操作,就记录当前访问的IP,然后累加访问次数
        //1. 获取当前操作的IP地址
        String ip = httpServletRequest.getRemoteAddr();
        //2. 根据IP地址从Map取值,并递增
        Integer count = ipCountMap.get(ip);
        if (count == null){
            ipCountMap.put(ip,1);
        }else{
            ipCountMap.put(ip,ipCountMap.get(ip) + 1);
        }


    }

}

OK, 做业务就是这样了

【自动配置类】

package cn.dingjiaxiong.autoconfig;

/**
 * ClassName: IpAutoConfiguration
 * date: 2022/10/25 17:15
 *
 * @author DingJiaxiong
 */

public class IpAutoConfiguration {
}

【创建META-INF 的 spring.factories,让它自动配置】

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  cn.dingjiaxiong.autoconfig.IpAutoConfiguration

在这里插入图片描述

实现一下配置类

package cn.dingjiaxiong.autoconfig;

import cn.dingjiaxiong.service.IpCountService;
import org.springframework.context.annotation.Bean;

/**
 * ClassName: IpAutoConfiguration
 * date: 2022/10/25 17:15
 *
 * @author DingJiaxiong
 */

public class IpAutoConfiguration {

    @Bean
    public IpCountService ipCountService(){
        return new IpCountService();
    }

}

OK了,现在我们已经可以直接在08 SSMP 中去使用这个starter 了

不过要先安装到仓库中,【先clean 再 install】

在这里插入图片描述

OK,在08 中导入坐标

<dependency>
    <groupId>cn.dingjiaxiong</groupId>
    <artifactId>ip_spring_boot_starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

在这里插入图片描述

这样这个模块就进来了

调用一下

修改controller

@Autowired
private IpCountService ipCountService;

@GetMapping("/{currentPage}/{pageSize}")
public R getPage(@PathVariable int currentPage, @PathVariable int pageSize,Book book) {

    ipCountService.count();

    IPage<Book> page = bookService.getPage(currentPage, pageSize,book);

    //如果当前页码值大于了总页码值,那么重新执行查询操作,使用最大页码值作为当前页码值
    if (currentPage > page.getPages()){
        page = bookService.getPage((int) page.getPages(),pageSize);
    }
    return new R(null != page, page);
}

为了更好的查看到效果

package cn.dingjiaxiong.service;

import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * ClassName: IpCountService
 * date: 2022/10/25 16:49
 *
 * @author DingJiaxiong
 */


public class IpCountService {

    private Map<String, Integer> ipCountMap = new HashMap<String, Integer>();

    @Autowired
    private HttpServletRequest httpServletRequest; //当前的request 对象的注入工作由使用当前starter的工程提供自动装配

    //调用这个方法,就可以统计ip的访问次数
    public void count() {

        //每次调用当前操作,就记录当前访问的IP,然后累加访问次数
        //1. 获取当前操作的IP地址
        String ip = httpServletRequest.getRemoteAddr();

        System.out.println("==============================================" + ip);

        //2. 根据IP地址从Map取值,并递增
        Integer count = ipCountMap.get(ip);
        if (count == null){
            ipCountMap.put(ip,1);
        }else{
            ipCountMap.put(ip,ipCountMap.get(ip) + 1);
        }


    }

}

改了下打印

记得重新clean 、安装一下

在这里插入图片描述

OK, 直接启动SSMP

在这里插入图片描述

效果很明显,已经拿到了。OK,这就说明程序已经跑通了

OK回顾一下

业务功能开发

在这里插入图片描述

自动配置类

在这里插入图片描述

配置

在这里插入图片描述

模板调用

在这里插入图片描述

2.2.3 小结
  1. 使用自动配置加载业务功能
  2. 切记使用之前先clean后install安装到maven仓库,确保资源更新

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

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

相关文章

阿里云服务器安装mysql8

1. 安装前准备 查看是否安装&#xff1a; rpm -qa | grep mysql移除不想要的版本&#xff1a; yum remove 名称查找关于mysql的所有文件&#xff08;配置文件&#xff09; find / -name mysql ##或者 whereis mysql删除配置文件 rm -rf 文件最后需要注意的是&#xff1a;卸载后…

配置iSCSI实现Linux的远程块存储

文章目录一 名词解释二 需求三 环境准备四 搭建流程1 服务端准备硬盘并分区2 服务端安装软件包&#xff0c;并启动服务3 服务端 5个create 操作3-1 定义块设备&#xff0c;创建后备存储。3-2 为目标创建IQN3-3 创建一个ACL来控制特定的客户端访问3-4 为每个后备存储创建一个LUN…

基于C#的校园闲置物品共享系统的开发和实现(Asp.net+Web)

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1选题背景 1 1.1.1校园闲置物品共享系统的开发背景 1 1.1.2学生闲置物品交易活动的现状 1 1.2 校园闲置物品共享系统的研究方向和内容 1 1.2.1研究方向 1 1.2.2研究内容 2 1.3 校园闲置物品共享系统的设计目标 2 1.4 校园闲置物品共…

Visual Studio Code(vs code) 安装c# .net环境 solution

Visual Studio Code(vs code) 安装c# .net环境 solution 一、安装.net必要环境 1.安装环境 https://dotnet.microsoft.com/zh-cn/download 我这里选择的是 .net 6.0 ;版本 .net SDK x86 2.在vs code拓展 搜索.net 全名&#xff1a;.NET Core Extension Pack 作者&#xf…

操作系统的发展与分类

文章目录世界上第一台通用电子计算机操作系统的发展阶段1. 手工操作阶段&#xff08;无操作系统的计算机系统&#xff09;2. 批处理阶段&#xff1a;同时处理多道程序3. 分时操作系统&#xff08;Time Sharing System&#xff09;4. 实时操作系统&#xff08;Real Time System&…

毫米波传感器原理介绍:测距

因为本篇是第一篇关于毫米波雷达传感器设备的介绍&#xff0c;我便多啰嗦两句。近几年随着无人驾驶等领域在国内的火热&#xff0c;做支撑实现无人驾驶的智能设备也多了起了&#xff0c;首当其冲的便是无人驾驶的眼睛“摄像头”&#xff0c;同样作为一种辅助手段的雷达技术也被…

HTMLDOM中的API之btoa和atob

btoa() btoa() 方法可以将一个二进制字符串&#xff08;例如&#xff0c;将字符串中的每一个字节都视为一个二进制数据字节&#xff09;编码为 Base64 编码的 ASCII 字符串。 示例&#xff1a; let encodedData window.btoa("Hello, world"); // 编码 let decode…

【C++笔试强训计划】第一天

遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即随本心 欢迎来到我的笔试强训计划专栏&#xff0c;这是计划正式开始的第一天。另外&#xff0c;我想说的是&#xff1a;博主本身水平有限&#xff0c;本专栏只作为学习笔记分享记录使用&#xff0c;对于一些题目…

Linux中如何获得进程的运行时堆栈

关于这个话题&#xff0c;我们一般是为了处理一下生产环境中程序出现死循环或者死锁等问题。我们一般想到的方法就是gdb attach上一个运行中的进程。但是这个需要手动交互。通过网上查找和实践&#xff0c;可以有以下几种选择&#xff1a; 第一种&#xff1a;pstack 进程ID …

【电商】管理后台--采购管理(执行层)

采购&#xff0c;从表面上看是公司花钱的部门&#xff0c;实则担负了寻找、管理供应商的重任&#xff0c;确保公司绝大部分的供应链成本可以保质、保量的完成。 现在很多电商企业&#xff0c;都不自己生产产品&#xff0c;产品的来源基本上都是从供应商那里采购&#xff0c;所以…

【服务器搭建】教程四:域名怎样进行备案?快来看~

前言 购买一台服务器&#xff0c;再来个域名&#xff0c;搭建一个自己的个人博客网站&#xff0c;把一些教程、源码、想要分享的好玩的放到网站上&#xff0c;供小伙伴学习玩耍使用。我把这个过程记录下来&#xff0c;想要尝试的小伙伴&#xff0c;可以按照步骤&#xff0c;自己…

你好,法语!A2知识点总结(1)

1.语式及时态 语式&#xff1a; 1.1直陈式&#xff1a; -直陈式现在时 1&#xff09;动词变位&#xff1a; 以er结尾的动词为第一组动词 变位规则&#xff1a; 去er&#xff0c;得到词根&#xff0c;加上相应词尾 e es e ons ez ent 第二组动词变位 以ir结尾为第二组动词…

LeetCode 图解 | 141.环形链表

141.环形链表题目描述思路分析快慢指针思想代码实现题目描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内…

Nuxt 3.0.0正式发布,集成Element Plus和Ant Design Vue脚手架

发布说明 Nuxt 是使用简便的 Web 框架&#xff0c;用于构建现代和高性能的 Web 应用&#xff0c;可以部署在任何运行 JavaScript 的平台上。 Nuxt 3.0 11天前正式发布了稳定版&#xff0c;3.0 基于 Vue 3&#xff0c;为 TypeScript 提供了 “一等公民” 支持&#xff0c;并进行…

【Unity3D】卷轴特效

1 原理 当一个圆在地面上沿直线匀速滚动时&#xff0c;圆上固定点的运动轨迹称为旋轮线&#xff08;或摆线、圆滚线&#xff09;。本文实现的卷轴特效使用了旋轮线相关理论。 以下是卷轴特效原理及公式推导&#xff0c;将屏幕坐标 (x) 映射到纹理坐标 (u)。 注意&#xff1a;屏…

Controller Area Network(CAN)简介

文章目录前言-什么是通讯&#xff1f;一、CAN是什么&#xff1f;二、CAN的应用示例CAN网络细分三、CAN发展历史四、汽车网络汇总总结前言-什么是通讯&#xff1f; “通讯是两个或两个以上参与者之间交换信息的有意识活动&#xff0c;目的是通过符号和语义规范的共享系统来发送…

微服务系列之初探“微服务架构”

随笔 有时你必须对你想得到的东西充满敬畏。 参考书籍&#xff1a; “凤凰架构”“微服务架构设计模式” 在了解微服务架构之前我们有必要解答“什么是架构”、“什么是架构的风格”这两个问题&#xff0c;同时需要带着“架构并不是被发明出来的&#xff0c;而是持续演进的…

[AI] LRTA*ls(k)搜索算法

LRTA*LS[K]一、LRTA*(K)算法的缺点二、LRTA∗LS(k)LRTA*_{LS}(k)LRTA∗LS​(k)算法1、选择局部空间2、更新局部空间论文在这里&#xff01; 一、LRTA*(K)算法的缺点 LRTA*(K)算法每次要更新队列Q里的state&#xff0c;但有三点缺陷&#xff1a; 如果state y进入 Q&#xff0c…

【网络工程】6、防火墙介绍及配置实操

接上篇《5、路由器介绍及配置实操》 之前我们讲解了网络设备路由器的介绍&#xff0c;以及完成了路由器的相关配置实操。本篇我们来讲解防火墙的基础知识以及相应的实操案例。 一、什么是防火墙&#xff1f; 防火墙是一个安全产品&#xff0c;它可以把安全的内网和不安全的外网…

【前端】jQuery-概述+基本使用+常用API

目录 一、jQuery概述 1.1JavaScript库 1.2jQuery的概念 二、jQuery的基本使用 2.1jQuery的下载 2.2jQuery的使用步骤 2.3jQuery的入口函数 2.4jQuery的顶级对象$ 2.5jQuery对象和DOM对象 三、jQuery常用API 3.1jQuery选择器 3.1.1jQuery基础选择器 3.1.2jQuery层级选…