本文介绍: Autowired@Override@Bean@Override写完后要在启动类上加上拦截器哟!,使用Import加进去。@Bean

自定义starter案例——统计独立IP访问次数

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ip计数业务功能开发

在这里插入图片描述

public class IpCountService {

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

    @Autowired
    // 当前request对象的诸如工作当前starter工程提供自动装配
    private HttpServletRequest httpServletRequest;

    public void count(){

        // 每次调用当前操作,就记录当前访问ip然后累加访问次数
        // 1.获取当前操作ip地址
        String ip = httpServletRequest.getRemoteAddr();
        System.out.println("----------------------------------" + ip);
        // 2.根据ip地址map取值,并递增
        ipCountMap.put(ip,ipCountMap.get(ip)==null? 0+1 : ipCountMap.get(ip) + 1);
    }
}

在这里插入图片描述
使用@import注入bean可以

public class IpAutoCinfiguration {

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

在这里插入图片描述

org.springframework.boot.autoconfigure.EnableAutoConfiguration=
cn.itcast.autoconfig.IpAutoCinfigur

在这里插入图片描述

    @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,book);
        }
        return new R(true,page);
    }

在这里插入图片描述

定时任务报表开发

在这里插入图片描述

@EnableScheduling
public class IpAutoCinfiguration {

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

在这里插入图片描述

@Scheduled(cron = "0/5 * * * * ?")
    public void print(){
        System.out.println("           ip访问监控");
        System.out.println("+-----ip-address-----+---+");
        for (Map.Entry<String, Integer> entry : ipCountMap.entrySet()) {
            String key = entry.getKey();
            Integer value = entry.getValue();
            System.out.println(String.format("|%18s  |%5d  |",key,value));
        }
        System.out.println("+--------------------+---+");
    }

在这里插入图片描述

使用属性配置功能设置功能参数

在这里插入图片描述

@ConfigurationProperties(prefix = "tools.ip")
public class IpProperties {

    /**
     * 日志显示周期
     */
    private Long cycle = 5L;
    /**
     * 是否周期内重置数据
     */
    private Boolean cycleReset = false;
    /**
     * 日志输出模式  detail:详细模式,simple极简模式
     */
    private String model = LogModel.DETAIL.value;


    public enum LogModel{
        DETAIL("detail"),
        SIMPLE("simple");
        private String value;
        LogModel(String value){
            this.value = value;
        }
        public String getValue(){
            return value;
        }
    }

    public Long getCycle() {
        return cycle;
    }

    public void setCycle(Long cycle) {
        this.cycle = cycle;
    }

    public Boolean getCycleReset() {
        return cycleReset;
    }

    public void setCycleReset(Boolean cycleReset) {
        this.cycleReset = cycleReset;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }
}

在这里插入图片描述

@EnableScheduling
@EnableConfigurationProperties(IpProperties.class)
public class IpAutoCinfiguration {

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

在这里插入图片描述

    @Autowired
    private IpProperties ipProperties;

    @Scheduled(cron = "0/5 * * * * ?")
    public void print(){

        if(ipProperties.getModel().equals(IpProperties.LogModel.DETAIL.getValue())){
            System.out.println("           ip访问监控");
            System.out.println("+-----ip-address-----+--num--+");
            for (Map.Entry<String, Integer> entry : ipCountMap.entrySet()) {
                String key = entry.getKey();
                Integer value = entry.getValue();
                System.out.println(String.format("|%18s  |%5d  |",key,value));
            }
            System.out.println("+--------------------+---+");
        } else if (ipProperties.getModel().equals(IpProperties.LogModel.SIMPLE.getValue())) {
            System.out.println("       ip访问监控");
            System.out.println("+-----ip-address-----+");
            for (String key : ipCountMap.keySet()) {
                System.out.println(String.format("|%18s  |",key));
            }
            System.out.println("+--------------------+");
        }

        if(ipProperties.getCycleReset()){
            ipCountMap.clear();
        }
    }

在这里插入图片描述
在这里插入图片描述

tools:
  ip:
#    cycle: 1
#    cycle-reset: true
#    model: "simple"

配置调整

在这里插入图片描述
自定义bean名称原因如下
因为我们的周期属性是要配置在cron表达式中的,但是如何获取配置的属性需要读取bean,但是直接bean的话,名字特别长,而且这个bean的名字和beanName的生成器生成名称恰巧与我们的表达式冲突,所以就曲线救国,自己给bean起个名字
但是自己起个名字出现了另一个问题我们的配置类上以前是使用@EnableConfigurationProperties(IpProperties.class)注册的IpProperties的bean,现在IpProperties被注册两次bean,又有了新的问题,所以我们在IpAutoCinfiguration上把以前的EnableConfigurationProperties的方式换成Import方式导入bean。
在这里插入图片描述
在这里插入图片描述

自定义拦截器

在这里插入图片描述

public class IpCountInterceptor implements HandlerInterceptor {
    @Autowired
    private IpCountService ipCountService;
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        ipCountService.count();
        return true;
    }

}

在这里插入图片描述

@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
    @Bean
    public IpCountInterceptor ipCountInterceptor(){
        return new IpCountInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(ipCountInterceptor()).addPathPatterns("/**");
    }
}

写完后要在启动类上加上拦截器哟!,使用Import加进去。

@EnableScheduling
//@EnableConfigurationProperties(IpProperties.class)
@Import({IpProperties.class, IpCountInterceptor.class, SpringMvcConfig.class})
public class IpAutoCinfiguration {

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

开启yml提示功能

在这里插入图片描述

<!--        <dependency>-->
<!--            <groupId>org.springframework.boot</groupId>-->
<!--            <artifactId>spring-boot-configuration-processor</artifactId>-->
<!--        </dependency>-->

用这个坐标生成springconfigurationmetadata,也就是加上这个坐标然后cleaninstall,就会生成这个文件,把这个文件target目录找到并且提出来,放到我们的配置目录下,这个坐标可以注释了,因为上线用不到。
在这里插入图片描述

  "hints": [
    {
      "name": "tools.ip.model",
      "values": [
        {
          "value": "detail",
          "description": "详细模式."
        },
        {
          "value": "simple",
          "description": "极简模式."
        }
      ]
    }
  ]

提示功能默认是[],自己照着样子配就行了。
在这里插入图片描述

原文地址:https://blog.csdn.net/shall_zhao/article/details/134776512

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43576.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注