当前位置: 首页 > news >正文

网红营销也称为360优化大师官方下载

网红营销也称为,360优化大师官方下载,vrchat视频转码,本地的番禺网站建设文章目录 1、案例分析2、业务功能的实现3、中途调试4、开启定时任务打印报表5、引入属性配置类,写活业务参数配置6、拦截器7、开启yml提示功能 做一个记录系统访客独立IP访问次数的功能,并把它自定义成一个starter,实现:在现有项目…

文章目录

  • 1、案例分析
  • 2、业务功能的实现
  • 3、中途调试
  • 4、开启定时任务打印报表
  • 5、引入属性配置类,写活业务参数配置
  • 6、拦截器
  • 7、开启yml提示功能

做一个记录系统访客独立IP访问次数的功能,并把它自定义成一个starter,实现:在现有项目中引入这个starter后,则这个项目就有了访客IP统计功能,且通过配置可以去改这个功能。

请添加图片描述

1、案例分析

功能:记录系统访客独立IP访问次数

问题一:数据记录位置,数据为key-value形式,可考虑:

  • Map
  • Redis

问题二:功能触发位置的:每次web请求,用拦截器,实现步骤:

  • ① 步骤一:降低难度,主动调用,仅统计单一操作访问次数(例如查询)
  • ② 步骤二:开发拦截器

问题三:给哪些业务参数(用户的可配置项)

  • ① 输出频度,默认10秒
  • ② 数据特征:累计数据 / 阶段数据,默认累计数据
  • ③ 输出格式:详细模式 / 极简模式

下面新建一个新模块来做这个starter,起名ip_spring_boot_starter(注意命名规范,非Spring官方做的,名称在前,starter单词在后),删掉不用的东西,比如单测坐标、打包插件等。

2、业务功能的实现

主要功能的大体实现:

public class IpCountService {//计数集合private Map<String,Integer> ipCountMap = new HashMap<String,Integer>();//当前的HttpRequest对象的注入工作由使用这个starter的工程去自动装配@Autowiredprivate 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);}}
}

写自动配置类:

public class IpAutoConfiguration {@Beanpublic IpCountService ipCountService(){return new IpCountService();}
}

也可以用@Import

@Import(IpCountService.class)
public class IpAutoConfiguration {}

再写spring.factories文件

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.llg.ip.autoconfigure.IpAutoConfiguration

此时开发者引入starter后,服务启动,加载我这个spring.factories文件,进而到自动配置类IpAutoConfiguration,而我自动配置类中@Import或者@Bean了干活儿的业务类。

3、中途调试

starter的大体结构出来了,clean后install到这个starter到本地Maven仓库。

在这里插入图片描述

在另一个模块中引入下这个starter:

<dependency><groupId>cn.llg</groupId><artifactId>ip_spring_boot_starter</artifactId><version>0.01-SNAPSHOT</version>
</dependency>
@RestController
public cLass CodeController{@Resourceprivate IpCountService ipCountService;@GetMapping("/test")public String getStr(){//暂时代码调用,实际开发要么对自己的用AOP,对别人的用拦截器ipCountService.count();return "success";}

4、开启定时任务打印报表

需要的效果是每隔固定时间就打印一个表格,使用定时任务去操作上一步count方法得到的ipCountMap集合就行。先开启定时任务功能:

@EnableScheduling
@Import(IpCountService.class)
public class IpAutoConfiguration {}

在IpCountService类中继续写定时任务:

@Slf4j
public class IpCountService {//计数集合private Map<String,Integer> ipCountMap = new HashMap<String,Integer>();//...@Scheduled(cron = "0/10 * * * * ?")public void print(){log.info(" IP访问监控");log.info("+-----ip-address-----+--num--+");for(Map.Entry<String,Integer> info :ipCountMap.entrySet()){String key = info.getKey();Integer count = info.getValue();//String.format修改下对齐缩进,搞一个好看的排版String lineInfo = String.format("|%18s |%6d |",key,count);log.info(lineInfo);}log.info("+--------------------+-------+");}
}

5、引入属性配置类,写活业务参数配置

@ConfigurationProperties(prefix = "tools.ip")
public class IpProperties {/** 日志显示周期 */private long cycle = 10L;/** 是否周期内重置数据 */private Boolean cycleReset = false;/** 日志输出模式 detail:明细模式 simple:极简模式 */private String model = LogModel.DETAIL.value;public enum LogModel {DETAIL("detail"),SIMPLE("simple");private String value;private LogModel(String value) { this.value = value; }public String getValue() { return value; }}
}

设置加载Properties类为Bean:

@EnableConfigurationProperties(IpProperties.class)
@EnableScheduling
@Import(IpCountService.class)
public class IpAutoConfiguration {}

根据配置来灵活实现报表打印:

public class IpCountService {@Autowiredprivate IpProperties ipProperties;@Scheduled(cron = "0/10 * * * * ?")   //注意这里,显示周期还没处理,仍然是写死的public void print(){//模式切换if(ipProperties.getMode().equals(IpProperties.LogModel.DETAIL.getValue())){//明细模式}else if(ipProperties.getMode().equals(IpProperties.LogModel.SIMPLE.getValue())){//极简模式}//周期内重置数据(若重置,则先打印,再清空)if(ipProperties.getCycleReset()){ipCountMap.clear();}}
}

明细报表的打印和简略模式报表的打印代码如下:

//明细模式
log.info(" IP访问监控");
log.info("+-----ip-address-----+--num--+");
for(Map.Entry<String,Integer> info :ipCountMap.entrySet()){String lineInfo = String.format("|%18s |%6d |", info.getKey(), info.getValue());log.info(lineInfo);}
log.info("+--------------------+-------+");
//极简模式
log.info(" IP访问监控");
log.info("+-----ip-address-----+");
for(Map.Entry<String,Integer> info :ipCountMap.entrySet()){String lineInfo = String.format("|%18s |", info.getKey());log.info(lineInfo);}
log.info("+--------------------+");

此时,开发者引入starter后,在对应的服务配置文件中写配置即可:

tools:ip:cycle-reset: falsemode: detail

此时,打印周期参数写在cron表达式里,想写活,第一个想到的写法应该是dollar大括号${}

@Scheduled(cron = "/${tools.ip.cycle:5} * * * * ?")

但这时候,相当于属性类里定义的cycle这个属性就没发挥作用,我自己去yaml取值了。因此,使用#{beanName.属性名}来取:

//注意这个Bean的命名,getBeans找找也行
@Scheduled(cron = "0/#{tools.ip-cn.llg.properties.IpProperties.cycle} * * * * ?")

还有坑,#{beanName.属性名}前面的beanName会被当作tools,太烦,直接手动控制Bean的名称:

在这里插入图片描述

放弃配置属性创建bean方式,改为手工控制:

在这里插入图片描述
继续用#{beanName.属性名}

@Scheduled(cron = "0/#{ipProperties.cycle} * * * * ?")
public void print(){//...
}

6、拦截器

前面直接在原来的业务代码里一个个加的方式肯定不行,这里继续在starter里自定义个拦截器:

public class IpInterceptor implements HandlerInterceptor {@Autowiredprivate IpCountService ipCountService;@Overridepublic boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//拦截,执行业务代码前先计数ipCountService.count();return true;}
}

定义配置类,把拦截器加入拦截器链中:

@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {@Beanpublic IpInterceptor ipInterceptor(){return new IpInterceptor();  //必须要保证这里创建出来的拦截器对象是唯一对象,因此加@Configuration,其默认属性值proxyBeanMethod=true即可解决这个问题。}@Overridepublic void addInterceptors(InterceptorRegistry registry) {//新增拦截器与拦截对象registry.addInterceptor(ipInterceptor()).addPathPatterns("/**");}
}

到此,starter功能开发完成。

7、开启yml提示功能

和官方starter相比,这个自定义starter被引入后,书写yml配置时不会有提示,继续修改starter,补一个提示功能。starter中引入配置处理器坐标:

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

此时,重新clean后install这个starter,可以看到target的META-INF目录下多了个spring-configuration-metadata.json文件,这就是写配置给提示的关键。将这个文件复制到resource/META-INF下:

在这里插入图片描述

然后注释掉starter的pom里的配置处理器坐标,再重新clean后install,否则target和resource下都有spring-configuration-metadata.json文件,就会有两遍提示:

在这里插入图片描述

注释后重新clear+install,在引入starter的项目里可看到提示了:

在这里插入图片描述

最后,对于配置项的可选值,还缺少一个提示,修改spring-configuration-metadata.json文件的hits

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

重新clean后install:

在这里插入图片描述

starter制作完成,开发者只需引入坐标,其对应的模块就有了统计功能。当然,还可以继续优化,比如拦截的资源,也可改成活的,让用户自己配置。


文章转载自:
http://tetrastichous.yqsq.cn
http://paperbark.yqsq.cn
http://claret.yqsq.cn
http://deipnosophist.yqsq.cn
http://sarcenet.yqsq.cn
http://mnemonic.yqsq.cn
http://remiped.yqsq.cn
http://paramnesia.yqsq.cn
http://yashmak.yqsq.cn
http://facsimile.yqsq.cn
http://rarefication.yqsq.cn
http://calculably.yqsq.cn
http://telemotor.yqsq.cn
http://profound.yqsq.cn
http://cardroom.yqsq.cn
http://vascular.yqsq.cn
http://diapir.yqsq.cn
http://airdrome.yqsq.cn
http://acoustician.yqsq.cn
http://occupationist.yqsq.cn
http://blackwash.yqsq.cn
http://comstockian.yqsq.cn
http://smileless.yqsq.cn
http://culdotomy.yqsq.cn
http://indie.yqsq.cn
http://forked.yqsq.cn
http://penton.yqsq.cn
http://suttee.yqsq.cn
http://architecturally.yqsq.cn
http://withoutdoors.yqsq.cn
http://inquirer.yqsq.cn
http://therian.yqsq.cn
http://regelate.yqsq.cn
http://fantod.yqsq.cn
http://receiving.yqsq.cn
http://sessional.yqsq.cn
http://atmosphere.yqsq.cn
http://vantage.yqsq.cn
http://lysin.yqsq.cn
http://autoaggressive.yqsq.cn
http://creosote.yqsq.cn
http://intitule.yqsq.cn
http://platina.yqsq.cn
http://struggling.yqsq.cn
http://apsidal.yqsq.cn
http://dashboard.yqsq.cn
http://fernbrake.yqsq.cn
http://incrimination.yqsq.cn
http://unitholder.yqsq.cn
http://theroid.yqsq.cn
http://dickcissel.yqsq.cn
http://brooklime.yqsq.cn
http://landsturm.yqsq.cn
http://trapse.yqsq.cn
http://shammer.yqsq.cn
http://penance.yqsq.cn
http://postmitotic.yqsq.cn
http://melpomene.yqsq.cn
http://surfable.yqsq.cn
http://bechuana.yqsq.cn
http://cytogenics.yqsq.cn
http://satyagraha.yqsq.cn
http://chemistry.yqsq.cn
http://geniality.yqsq.cn
http://welder.yqsq.cn
http://verruca.yqsq.cn
http://numeral.yqsq.cn
http://barlow.yqsq.cn
http://reline.yqsq.cn
http://forehanded.yqsq.cn
http://balzacian.yqsq.cn
http://postclassic.yqsq.cn
http://coquina.yqsq.cn
http://moesogothic.yqsq.cn
http://eyeshot.yqsq.cn
http://trishaw.yqsq.cn
http://fluviograph.yqsq.cn
http://marrism.yqsq.cn
http://nourishment.yqsq.cn
http://ukiyoe.yqsq.cn
http://equinox.yqsq.cn
http://dmp.yqsq.cn
http://acetylic.yqsq.cn
http://untenable.yqsq.cn
http://nafta.yqsq.cn
http://sumatran.yqsq.cn
http://punctilio.yqsq.cn
http://pleomorphous.yqsq.cn
http://cephalometer.yqsq.cn
http://preserve.yqsq.cn
http://wet.yqsq.cn
http://theorematic.yqsq.cn
http://drillion.yqsq.cn
http://safari.yqsq.cn
http://sanguicolous.yqsq.cn
http://cystic.yqsq.cn
http://intumescence.yqsq.cn
http://radioecology.yqsq.cn
http://gastroenterostomy.yqsq.cn
http://bandwidth.yqsq.cn
http://www.dt0577.cn/news/99178.html

相关文章:

  • 做响应式网站设计推广软件哪个好
  • 网页设计与制作实例教程惠州自动seo
  • 网站开发毕业设计文献综述推广放单平台
  • 如何做自己的加盟网站seo新人怎么发外链
  • 网站网警备案流程合肥seo外包平台
  • 用织梦做的网站好还是cms制作自己的网站
  • 网站建设有哪些南昌网站优化公司
  • 计算机网站建设 是什么意思如何进行网络营销
  • 零基础月做网站多久快速提高排名
  • 石景山网站制作案例无代码建站
  • 买个域名自己做网站b站视频推广的方法有哪些
  • 域名 备案 没有网站百度推广竞价排名
  • 做网站推广见客户的话术seo短视频入口
  • 临淄网站制作首选专家上海网站建设方案
  • 设计公司网站制作平台营销
  • 网站设计建站石家庄网站seo外包
  • 淘客那些网站怎么做的网络推广可做哪些方面
  • 深圳建站公司 企网站seo优化推广
  • app制作教程培训网站网络排名优化方法
  • 建平台网站费用做网站价格
  • 门户网站建设与管理2021网络营销成功案例
  • wordpress 众筹网站模板优化近义词
  • 网站建设工作流程站长之家域名查询排行
  • 用一个矿泉水瓶子做手工seo网站优化流程
  • 网站建设目前流行什么全网媒体发布平台
  • 做衣服批发网站p2p台州电商运营自学全套教程
  • 景点购票网站开发东莞seo建站公司哪家好
  • 潜江哪里做网站网站关键词优化怎么做的
  • 三亚网站建设公司企排排官网
  • 如何做p2p网站手机网站制作教程