<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/sunbufu</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sunbufu]]></copyright><item><title><![CDATA[RestTemplate中的URLEncode]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/85228423</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/85228423</guid><author>sunbufu</author><pubDate>Mon, 24 Dec 2018 08:50:36 +0800</pubDate><description><![CDATA[文章目录0. 起因1. 经过2. 结论
0. 起因
正常情况下 url 只会出现英文字母、数字和标点符号，特殊字符会在请求前进行 encode 操作，转化成合法的 url。 例如我们用浏览器在百度上搜索 += 时，浏览器实际上访问的是 https://www.baidu.com/s?wd=%2B%3D。
encode 操作其实是将需要转码的字符转为 16 进制，然后从右到左，取 4 位(不足 4 ...]]></description><category></category></item><item><title><![CDATA[authorize(基于注解的权限认证框架)]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/80379844</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/80379844</guid><author>sunbufu</author><pubDate>Sun, 20 May 2018 09:47:48 +0800</pubDate><description><![CDATA[一、是什么

很多项目都会用到权限管理，目前流行的权限框架（Apache Shiro，Spring Security等）在使用的时候都觉得很繁琐，特别是在一些小型的项目中。有时候我会想，如果通过注解的方式，直接把权限注解到访问的接口方法上那该有多好。 
authorize就是一个为了解决这个问题，通过注解配置权限，借助拦截器进行权限检查的一个权限框架。使用起来就像下面这种感觉。

@Access(...]]></description><category></category></item><item><title><![CDATA[发布jar包到maven中央仓库]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/80371303</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/80371303</guid><author>sunbufu</author><pubDate>Sat, 19 May 2018 10:18:52 +0800</pubDate><description><![CDATA[一、写在前面

最近做了一个权限认证的框架，想把jar发布到maven中央仓库上，方便大家使用。于是就有了这篇博客。



二、具体步骤

2.1 注册账号

首先要做的就是注册账号，这个账号可用于提出申请groupId的Issue，也可用于发布和登录到中央仓库。

2.1.1 注册sonatype

工单地址：https://issues.sonatype.org 




2.2 申请grou...]]></description><category></category></item><item><title><![CDATA[Spring StateMachine]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/80224326</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/80224326</guid><author>sunbufu</author><pubDate>Mon, 07 May 2018 13:18:24 +0800</pubDate><description><![CDATA[一、状态机

有限状态机是一种用来进行对象行为建模的工具，其作用主要是描述对象在它的生命周期内所经历的状态序列，以及如何响应来自外界的各种事件。在电商场景（订单、物流、售后）、社交（IM消息投递）、分布式集群管理（分布式计算平台任务编排）等场景都有大规模的使用。



状态机的要素：

状态机可归纳为4个要素，现态、条件、动作、次态。“现态”和“条件”是因，“动作”和“次态”是果。

1 现态：指...]]></description><category></category></item><item><title><![CDATA[单元测试总结]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/79971000</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/79971000</guid><author>sunbufu</author><pubDate>Tue, 17 Apr 2018 10:25:38 +0800</pubDate><description><![CDATA[1.软件测试

软件测试是一种用来鉴定软件的正确性、完整性、安全性和质量的过程。主要包括单元测试、集成测试和功能测试等。

1.1 单元测试

主要由开发人员进行，确保程序单元符合预期。

1.2 集成测试

主要由开发人员进行，测试整体程序等功能和性能。

1.3 功能测试

主要由测试人员进行，测试程序是否符合预期。

2.单元测试内容


模块接口测试
模块局部数据结构测试
模块边界条件测试...]]></description><category></category></item><item><title><![CDATA[Spring Cloud Config 使用本地配置文件]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/79291746</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/79291746</guid><author>sunbufu</author><pubDate>Thu, 08 Feb 2018 17:50:54 +0800</pubDate><description><![CDATA[一、简介

在分布式系统中，由于服务数量巨多，为了方便服务配置文件统一管理，实时更新，所以需要分布式配置中心组件。在Spring Cloud中，有分布式配置中心组件spring cloud config ，它支持配置服务放在配置服务的内存中（即本地），也支持放在远程Git仓库中。在spring cloud config 组件中，分两个角色，一是config server，二是config clie...]]></description><category></category></item><item><title><![CDATA[Spring Cloud 保证微服务内安全]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/79287340</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/79287340</guid><author>sunbufu</author><pubDate>Thu, 08 Feb 2018 11:41:57 +0800</pubDate><description><![CDATA[一、简介

在微服务的架构下，我们需要把系统的业务划分成多个单一的微服务。每个微服务都会提供接口供其他微服务调用，在Dubbo中可以通过rmi、nio等实现，Spring Cloud中是通过http调用的。但有些时候，我们只希望用户通过我们的网关调用微服务，不允许用户直接请求微服务。这时我们就可以借助Spring Security来保障安全。



二、使用步骤



2.1 在提供接口的微服务项...]]></description><category></category></item><item><title><![CDATA[数据库设计的三大范式]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/79192878</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/79192878</guid><author>sunbufu</author><pubDate>Mon, 29 Jan 2018 13:20:39 +0800</pubDate><description><![CDATA[数据库范式的定义

在设计数据库的时候，为了设计出合理的关系型数据库，就需要遵循一些规范要求，这些规范要求被成为数据库范式。 
目前，关系型数据库主要有六种范式：第一范式（1NF）、第二范式（2NF）、第三范式（3NF）、巴斯-科德范式（BCNF）、第四范式(4NF）和第五范式（5NF，又称完美范式）。一般来说，数据库满足前三个范式就可以了。



第一范式(1NF)

定义

所谓第一范式（1N]]></description><category></category></item><item><title><![CDATA[最短路径(弗洛伊德算法)]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/78479814</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/78479814</guid><author>sunbufu</author><pubDate>Wed, 08 Nov 2017 15:58:28 +0800</pubDate><description><![CDATA[1.定义概述Floyd-Warshall算法（Floyd-Warshall algorithm）是解决任意两点间的最短路径的一种算法，可以正确处理有向图或负权的最短路径问题，同时也被用于计算有向图的传递闭包。2.实例演示/**
 * 弗洛伊德算法求最短路径
 * @author sunbufu
 *
 */
public class ShortestPathFloyd {
    /**无穷大*/]]></description><category></category></item><item><title><![CDATA[最短路径（迪杰斯特拉）]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/78477879</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/78477879</guid><author>sunbufu</author><pubDate>Wed, 08 Nov 2017 13:54:20 +0800</pubDate><description><![CDATA[1.定义概览Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法，用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展，直到扩展到终点为止。2.实例演示设结点1为起点，依次求到其它结点的最短路径。 
/**
 * 迪杰斯特拉算法求最短路径
 * @author sunbufu
 *
 */
public class ShortestPathDijkstra {]]></description><category></category></item><item><title><![CDATA[Android电量View]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/76444217</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/76444217</guid><author>sunbufu</author><pubDate>Mon, 31 Jul 2017 15:33:37 +0800</pubDate><description><![CDATA[电量View，效果如下： 
1电量组件主要分三部分电池的外框，电池的头和电量。/**
 * 电量显示控件
 */
public class BatteryStateView extends View {
    private int mPower = 100;    public BatteryStateView(Context context) {
        super(context);]]></description><category></category></item><item><title><![CDATA[RxJava工具类]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/76430199</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/76430199</guid><author>sunbufu</author><pubDate>Mon, 31 Jul 2017 13:33:17 +0800</pubDate><description><![CDATA[为了快速实现在UI线程或者IO线程中工作，实现了一下工具类。当时参考了许多博客，可惜当时没有记录，现在也回忆不起来了。写在这里以备以后的使用。1 RxjavaUtil.java/**
 * Rxjava封装工具类
 */
public class RxjavaUtil {    /**
     * 在ui线程中工作
     * @param uiTask
     */
    public s]]></description><category></category></item><item><title><![CDATA[Kotlin版LogUtil]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/72857360</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/72857360</guid><author>sunbufu</author><pubDate>Sun, 04 Jun 2017 09:47:37 +0800</pubDate><description><![CDATA[最近在学习Kotlin，把一些常用的java版本的Util重新用Kotlin写了一遍，算是一边学习，一边做些轮子吧。 
运行效果如图所示： 
package sunbufu.mykotlin.utilimport android.util.Log/**
 * 日志工具类
 * @author sunbufu
 */
class LogUtil {    companion object {]]></description><category></category></item><item><title><![CDATA[JAVA线程池]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/69282044</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/69282044</guid><author>sunbufu</author><pubDate>Wed, 05 Apr 2017 18:41:00 +0800</pubDate><description><![CDATA[Executor两级调度模型 
在HotSpot虚拟机中，Java中的线程将会被一一映射为操作系统的线程。  
在Java虚拟机层面，用户将多个任务提交给Executor框架，Executor负责分配线程执行它们；  
在操作系统层面，操作系统再将这些线程分配给处理器执行。Executor结构 
Executor框架中的所有类可以分成三类： 
1. 任务  
任务有两种类型：Runnable和Cal]]></description><category></category></item><item><title><![CDATA[快速排序]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/69267275</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/69267275</guid><author>sunbufu</author><pubDate>Wed, 05 Apr 2017 17:51:00 +0800</pubDate><description><![CDATA[快速排序是目前所有排序中性能较好的一种算法，最好情况和平均情况下时间复杂度均为O(nlogn)，最坏的情况下时间复杂度为O(n^2)。快速排序采用递归，用空间换取时间。由于使用了递归，因此需要额外的存储空间。package sort;public class MyQuickSort {    /**
     * 快速排序
     * 快速排序的思想是选择一个基准数，把小于基准数的数字放到左边，大]]></description><category></category></item><item><title><![CDATA[JAVA获取IP]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/69264301</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/69264301</guid><author>sunbufu</author><pubDate>Wed, 05 Apr 2017 17:04:15 +0800</pubDate><description><![CDATA[HttpServletRequest的getRemoteAddr()在经过反向代理后就无效了。    /**
     * 获取http请求ip地址
     * @param request
     * @return
     */
    public static String getIpAddr(HttpServletRequest request) {
        String i]]></description><category></category></item><item><title><![CDATA[JVM调优参数]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/69263020</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/69263020</guid><author>sunbufu</author><pubDate>Wed, 05 Apr 2017 16:44:06 +0800</pubDate><description><![CDATA[常见配置汇总堆设置-Xms:初始堆大小 
  -Xmx:最大堆大小 
  -XX:NewSize=n:设置年轻代大小 
  -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3，表示年轻代与年老代比值为1：3，年轻代占整个年轻代年老代和的1/4 
  -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如：3，表示Ede]]></description><category></category></item><item><title><![CDATA[请求转发与重定向]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/66968826</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/66968826</guid><author>sunbufu</author><pubDate>Mon, 27 Mar 2017 10:34:52 +0800</pubDate><description><![CDATA[1. 重定向客户发送一个请求到服务器，服务器匹配servlet，这都和请求转发一样，servlet处理完之后调用了sendRedirect()这个方法，这个方法是response的方法，所以，当这个servlet处理完之后，看到response.senRedirect()方法，立即向客户端返回这个响应，响应行告诉客户端你必须要再发送一个请求，去访问student_list.jsp，紧接着客户端受到这]]></description><category></category></item><item><title><![CDATA[SQL总结]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/66968633</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/66968633</guid><author>sunbufu</author><pubDate>Mon, 27 Mar 2017 10:21:25 +0800</pubDate><description><![CDATA[一、SQL定义SQL语言的全称是Structured Query Language，即结构化查询语言。1、SQL分类1）DQL（Data Query Language 数据查询语言）查询语句只有一种，即SELECT语句。2）DML（Data Manipulation Language 数据操作语言）包括：INSERT、UPDATE、DELETE等常用语句。3）DDL（Data Definition]]></description><category></category></item><item><title><![CDATA[最小堆的JAVA实现]]></title><link>https://blog.youkuaiyun.com/sunbufu/article/details/63263675</link><guid>https://blog.youkuaiyun.com/sunbufu/article/details/63263675</guid><author>sunbufu</author><pubDate>Sat, 18 Mar 2017 18:38:18 +0800</pubDate><description><![CDATA[package sunbufu.sort;/**
 * 堆排序
 * 
 *              0
 *      1               2
 *  3       4       5       6
 * 
 * 在二叉树中：
 * 因为   
 *      根节点下标=左节点下标-1/2
 *      根节点下标=右节点下标-2/2
 * 所以
 *      左节点下标=]]></description><category></category></item></channel></rss>