IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot-自定义starter -> 正文阅读

[Java知识库]SpringBoot-自定义starter

作者:recommend-item-box type_blog clearfix


在SpringBoot中我们需要引入一项新的技术或者功能,往往只是在pom中引入相应的坐标这样简单就完成了,那么现在我们先尝试一下自定义一个starter模块,然后再使用一下

模块功能

在web应用中加入一个访问检测器,每当有用户访问网页时,后台打印出其ip地址和访问次数

实现过程

  • 需要一个web依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  • 创建一个新的模块,实现一个业务类,具体功能如下
public class IpCount {
  private Map<String,Integer> ipCountMap = new HashMap<>();

  @Autowired
  private HttpServletRequest request;
  public void count(){
    String ipAddress = request.getRemoteAddr();
    if (ipCountMap.containsKey(ipAddress)){
      ipCountMap.put(ipAddress,ipCountMap.get(ipAddress)+1);
    }
    else {
      ipCountMap.put(ipAddress,1);
    }
    System.out.println("ipAddress:"+ipAddress+"count:"+ipCountMap.get(ipAddress));
  }
}
@Autowired
private HttpServletRequest request;

HttpServletRequest的bean由使用这个模块的项目提供

  • 创建一个自动配置类,并初始化刚刚创建的业务类的bean
public class IpAutoConfiguration {
  @Bean
  public IpCount ipCount(){
    return new IpCount();
  }
}
  • 在resources下创建META-INF/spring.factories文件,将自动装配信息填入
    这样就会自动配置IpAutoConfiguration类的bean,同时启动它所依赖的所有bean
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  cn.ipcount.autoconfig.IpAutoConfiguration

写好之后用maven上传到本地的库中

  • 在需要使用的项目中引入这个依赖即可
<dependency>
    <groupId>cn.ipcount</groupId>
    <artifactId>ipcount_spring_boot_starter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
  • 现在就可以将其当做一个普通的第三方包使用了
@RestController
@RequestMapping("/account")
public class AccountController {

  @Autowired
  IpCount ipCount;
  @GetMapping
  public String getAccount(){
    ipCount.count();
    System.out.println("get...");
    return "success";
  }
}

定义属性

现在我们需要能够自定义属性,在使用时没有配置属性就用默认属性,配置了属性就使用配置的属性

  • 创建一个配置类
    这里仅仅设置一个简易的属性note,默认为"检测到用户访问"
@ConfigurationProperties(prefix = "ipcount")
public class IpProperties {
  private String note = "检测到用户访问";

  public String getNote() {
    return note;
  }

  public void setNote(String note) {
    this.note = note;
  }
}
  • 在自动装配类中启用配置
@EnableConfigurationProperties(IpProperties.class)
public class IpAutoConfiguration {
  @Bean
  public IpCount ipCount(){
    return new IpCount();
  }
}
  • 简单修改一下业务类中的方法,直接让其打印出note
public class IpCount {
  private Map<String,Integer> ipCountMap = new HashMap<>();

  @Autowired
  private IpProperties ipProperties;
  @Autowired
  private HttpServletRequest request;
  public void count(){
    String ipAddress = request.getRemoteAddr();
    if (ipCountMap.containsKey(ipAddress)){
      ipCountMap.put(ipAddress,ipCountMap.get(ipAddress)+1);
    }
    else {
      ipCountMap.put(ipAddress,1);
    }
    System.out.println(ipProperties.getNote());
    System.out.println("ipAddress:"+ipAddress+"count:"+ipCountMap.get(ipAddress));
  }
}

现在,如果没有配置属性,程序会在运行时打印默认的参数,如果在项目中配置了这个属性,那么则会打印配置的值

ipcount:
  note: "test"
test
ipAddress:[0:0:0:0:0:0:0:1]count:1
get...

加一个拦截器

这个模块目前只能在一个account-get请求里面使用,我们希望在所有资源请求都使用这个功能,于是想到了使用拦截器,当然也可以使用AOP,但是这是一个web应用,优先考虑拦截器。关于拦截器的知识也在之前的文章中已经解释过

  • 自定义拦截器
public class IpInterceptor implements HandlerInterceptor {
  @Autowired
  private IpCount ipCount;

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      throws Exception {
    ipCount.count();
    return true;
  }
}
  • 设置核心配置类,加载拦截器
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
  @Bean
  public IpInterceptor interceptor(){
    return new IpInterceptor();
  }

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(interceptor()).addPathPatterns("/**");
  }
}
  • 在IpAutoConfiguration中引入SpringMvcConfig
@EnableConfigurationProperties(IpProperties.class)
@Import(SpringMvcConfig.class)
public class IpAutoConfiguration {
  @Bean
  public IpCount ipCount(){
    return new IpCount();
  }
}

ok,这样一来我们就给模块加上了拦截器,并且成功定义了一个相对完整的starter,进一步了解了SpringBoot的自动装配机制

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-17 12:18:51  更:2022-10-17 12:22:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/30 13:45:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码