知乐博客

我的全栈之路,记录我的技术成长


  • 首页

  • 归档

  • 标签

  • 关于

  • 手册

Spring源码分析-BeanFactoryPostProcessors 应用之 PropertyPlaceholderConfigurer

发表于 2020-02-28   |   阅读次数

BeanFactoryPostProcessors

介绍

BeanFactoryPostProcessors完整定义:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Allows for custom modification of an application context's bean definitions,
* adapting the bean property values of the context's underlying bean factory.
* @see BeanPostProcessor
* @see PropertyResourceConfigurer
*/
public interface BeanFactoryPostProcessor {
/**
* Modify the application context's internal bean factory after its standard
* initialization. All bean definitions will have been loaded, but no beans
* will have been instantiated yet. This allows for overriding or adding
* properties even to eager-initializing beans.
* @param beanFactory the bean factory used by the application context
* @throws org.springframework.beans.BeansException in case of errors
*/
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}

我们知道spring最大优点就是其可扩展性,BeanFactoryPostProcessor接口就是spring中提供给我们用于扩展的一个地方。我们看该接口上的javadoc其实非常的详细,这也是我们看spring源码的一个技巧,就是看一个类是干嘛的一定要先通读其注释。

1
2
3
4
5
结合接口上的注释大致描述下BeanFactoryPostProcessor:
允许用户通过修改applicationContext 中的bean定义(就是xml中定义的bean的信息即:BeanDefinition是和xml有一对一的配置,比如是否是单利,以及propert 属性的赋值等)
来调整applicationContext中bean工厂中bean属性值。
也就是说执行到BeanFactoryPostProcessor时全部的BeanDefinition定义已经加载好了但是bean实例还没有被创建,我们可以修补或者覆盖bean属性值。
阅读全文 »

采用redis生成唯一且随机的订单号

发表于 2019-07-21   |   阅读次数

项目描述

最近做的一个项目有这么一个需求:需要生成一个唯一的11位的就餐码(类似于订单号的概念),就餐码的规则是:一共是11位的数字,前面6位是日期比如2019年07月20就是190720,后面五位是随机数且不能是自增的,不然容易让人看出一天的单量。

解决方案

五位随机数不能用随机生成的,不然可能不唯一,所以想到了预生成的方案:
采用redis

随机数生成

先生成10000~99999共9万个数(从1万开始是懒得再前面补0了),然后打乱分别 存入redis的list数据结构 90个key每个key存1000个数。取的时候通过LINDEX进行读取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
List<String> numList=new ArrayList<>();
//90万个数 每个redis key 1000个数,要存90个key.
for (int i=10000;i<=99999;i++){
numList.add(String.valueOf(i));
}
//打乱顺序
Collections.shuffle(numList);
//生成key
for (int j=10;j<=99;j++){
String redisKey="qrcode:"+j;
List<String> newList= test.subList((j-10)*1000,(j-10)*1000 + 1000);
jedisCluster.rpush(redisKey,newList.toArray(new String[newList.size()]));
}

这样每个key的index值就是0~999,key就是qrcode:10/qrcode:11/qrcode:12…/qrcode:99.

阅读全文 »

点评cat使用记录

发表于 2019-05-01   |   阅读次数

点评cat使用记录

cat介绍

CAT(Central Application Tracking),是基于 Java 开发的分布式实时监控系统。CAT在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案。CAT 目前在美团的产品定位是应用层的统一监控组件,基本接入了美团所有核心应用,在中间件(RPC、数据库、缓存、MQ 等)框架中得到广泛应用,为各业务线提供系统的性能指标、健康状况、实时告警等。

四大报表

  • Transaction 适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数
  • Event 用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小
  • Business报表对应着业务指标,比如订单指标。与Transaction、Event、Problem不同,Business更偏向于宏观上的指标,另外三者偏向于微观代码的执行情况。
    阅读全文 »

基于spring boot starter 对于api请求参数做出校验的自定义starter

发表于 2018-12-17   |   阅读次数

简介

  1. 基于spring boot starter的自动化配置特性,对于api请求参数做出校验的自定义starter
  2. 应用框架只需要加上注解例如@NotEmpty等即可,不需要写任何其他多余的代码来校验。
  3. 使用样例:https://github.com/yalunwang/demo-validator
  4. 源码:https://github.com/godgroup/summer-boot-validator

**欢迎使用,多多加star,如使用过程中碰到问题,可以提出Issue,我们会尽力完善。

阅读全文 »

java 内部类 嵌套类

发表于 2017-11-28   |   阅读次数

概述

java允许我们把一个类a定义在另一个类b里面,那么这个类a就叫做内部类。例如如下面:

  • 如果内部类似Non-static的那么被称作内部类

    1
    2
    3
    4
    5
    6
    class OuterClass {
    ...
    class NestedClass {
    ...
    }
    }
  • 如果内部类是static 的那么被称作嵌套类或者内部静态类

    1
    2
    3
    4
    5
    6
    7
    class OuterClass {
    ...
    static class StaticNestedClass {
    ...
    }
    }
阅读全文 »

spring装配bean

发表于 2017-10-17   |   阅读次数

概述

spring 的核心依赖注入:创建应用对象之间协作关系的行为称为装配(wiring),他有以下几种方式:

  • 自动装配(结合注解)
  • Java中显示的配置
  • 在xml中显示的配置

这三个方案,选哪一个都是可以的,能用自动配置的就有自动配置,对于一些框架的配置我们不能修改别人的源码,必要的xml显示配置也是必要的,而且我们也可以三个方案同时使用,一些Bean自动装配,一些Bean Java配置,一些Bean xml配置。
对于显示配置,多少有些不方便还是自动装配最简便,所以我们先讲第一个自动化配置

阅读全文 »

jdbc使用二

发表于 2017-10-17   |   阅读次数

数据库连接池

  1. 第一篇我们讲了JDBC的入门,我们每次访问数据库都要获取数据库连接,而数据库的连接的打开和关闭都会耗费很大的性能,所以为了解决这个问题出现了数据库连接池。
  2. 数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
  3. 连接池的最小和最大连接我们都可以通过开源的连接池框架提高的方法进行设置
  4. 连接池内部都实现了 javax.sql.DataSrouce 接口
    通过连接池获取的con关闭只是将连接还到连接池里
    阅读全文 »

jdbc使用一

发表于 2017-09-28   |   阅读次数

基本概念

  1. JDBC的全称为:java database connection 是用java代码来操作数据库的
  2. Sun公司为了简化、统一对数据库的操作,定义了一套java操作数据库的接口的规范,称之为JDBC。

    使用步骤

  3. 加载驱动类(例如:mysql com.mysql.jdbc.Driver )
  4. 定义url username password
  5. 通过DriverManager 获取连接Connection对象
  6. 通过连接对象创建Statement对象
  7. 使用Statement执行sql语句
  8. 释放资源
    阅读全文 »

nginx常用命令

发表于 2017-09-06   |   阅读次数

hexo搭建并部署到自己的服务器系列博客目录

发表于 2017-02-12   |   阅读次数

本站点就是基于这种方式运行

系列博客目录

  1. 在本地先创建hexo,用来编写文章。
  2. 服务器上搭建git服务器
  3. 本地hexo d 发布到第2步创建的git服务器
  4. 使用git hooks 来同步更新本地的push.
  5. 安装web服务器nginx或者tomact等,用来运行从第3步上传的博客

总结

  • 思路就是本地安装hexo用来写文章,服务器搭建好git远程仓库接收hexo d的部署。安装web服务器来运行静态博客。web服务器的root目录克隆 git仓库并利用git hooks自动更新。
  • 这样就可以本地写好文章执行hexo clean,hexo d来发布到服务器。再也不用登陆到服务器手动拉取或者利用ftp上传这样繁琐的步骤了。
12
yalunwang

yalunwang

不忘初心,方得始终。

18 日志
14 标签
GitHub 微博
友情链接
  • codingxiaxw
  • 小道博客
  • nginx中文站
  • 红萝卜
  • 快递查询
© 2016 - 2020 yalunwang 豫ICP备15019260号
由 Hexo 强力驱动
主题 - NexT.Mist