单例模式的实现

一、定义 单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的一个类只有一个实例。即一个类只有一个对象实例。 详情可以参考之前的博客 [单例模式]({{ site.url }}/2018/06/06/design-patterns-01/#3单例模式singleton){:target="_blank"}。 二、实现 2.1 基本实现 单例模式可以笼统的分为 饿汉式 和 懒汉式。 // 饿汉式 public class Singleton { /** 私有的构造方法 */ private Singleton() { } /** 私有的静态的对象 */ private static Singleton singleton = new Singleton(); /** 公共的静态的获取对象的方法 */ public static Singleton getInstance(){ return singleton; } } // 懒汉式 public class Singleton { /* 持有私有静态实例,防止被引用,此处赋值为null,目的是实现延迟加载 */ private static Singleton instance = null; /* 私有构造方法,防止被实例化 */ private Singleton() { } /* 静态工程方法,创建实例 */ public static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } /* 如果该对象被用于序列化,可以保证对象在序列化前后保持一致 */ public Object readResolve() { return instance; } } 饿汉式 会在类加载时直接创建对象。懒汉式 有点类似懒加载的感觉,在第一次使用的时候创建对象,但是这样也带来一个问题,如何保证线程安全。 上面的 懒汉式 其实是有问题的,多线程同时调用的时候会创建多个实例,所以用的比较多的是 double check 的实现方式。...

January 26, 2019 · 2 min · sunbufu

jekyll 博客的 PWA 配置

一、 什么是 PWA PWA(Progressive Web App)是一种理念,使用多种技术来增强 web app 的功能,可以让网站的体验变得更好,能够模拟一些原生功能,比如通知推送。在移动端利用标准化框架,让网页应用呈现和原生应用相似的体验。 就目前而言,PWA 对我产生最直接的影响有以下几点 速度的提升,缓存的使用使文章和博客的速度大大提升。 离线状态下,缓存过的文章也可以正常浏览。 PWA 应用可以表现的像原生系统一样。 二、如何配置 2.1 查询资料 在开始之间查询了一些资料,因为使用的 jekyll,尝试使用了 jekyll 的相关插件,效果并不理想。然后搜索了下 PWA 的相关资料后,发现并不是很难,于是尝试搞了下。所以建议大家也可以尝试按照我接下来的步骤配置,并不繁琐。 2.2 配置步骤 下面记录下我配置的步骤。 首先 PWA 需要一个描述文件 manifest.json,具体配置可以参考这个文档{:target="_blank"},也可以参考我的配置 manifest.json{:target="_blank"}。 在你的 html 文件中声明出来(因为我用的 jekyll,所以我在 _includes/header.html{:target="_blank"} 文件中声明)。 <head> ... <link rel="manifest" href="/manifest.json"> ... </head> 然后我们需要一个 service-worker 文件来处理 PWA 的额外功能,例如缓存。可以参考这个文档{:target="_blank"},也可以参考我的代码 manifest.json{:target="_blank"}。 其中缓存对应着一个版本号,因为我不想每次提交都重新修改下版本,比较麻烦。所以在这里我直接使用了 jekyll 的变量 site.time 把构建的时间作为版本号。 最后我们需要在 html 文件中注册这个 service-worker 文件,也可以参照我的文件_includes/footer.html{:target="_blank"},如下所示。 // 检测浏览器是否支持SW if(navigator.serviceWorker !...

January 23, 2019 · 1 min · sunbufu

博客部署 github 和 coding 双节点

0. 起因 发博客链接给朋友看的时候,反馈说访问特别慢。之前博客仅部署在 github 上,由于众所周知的原因,国外的服务器在国内访问就是有点慢,这个时候就需要一些 “奇淫巧技” 来帮忙了。 1. 经过 1.1 方案选择 首先是对问题分析,博客访问慢的原因是因为服务器在国外,经过一番查询后,基本上有一下 3 种解决方案。 在国内租台服务器 CDN 加速服务 部署到国内的服务器上 然后分析下这些方案。 租服务器的方案对于我来说是不乐观的,因为我就是为了不租服务器才选择的 github pages。一方面是因为价格,另一方面是因为维护起来比较麻烦,什么都需要自己去搞,时间和精力都不允许。 本来想通过 CDN 来解决,但是腾讯云的 CDN 需要备案,但我又没有服务器,所以也备不了案,所以这个方案也无法执行了。 国内也有一些类似 github 的代码托管,同时也支持 pages 服务,例如 coding{:target="_blank"}。我们只需要在 push 到 github 的时候同时 push 到 coding 上就可以了。 1.2 具体实施 在开始之前需要准备一些东西: 域名(国内买的域名需要实名认证,推荐在 godaddy{:target="_blank"} 买) coding 的账号 (coding 注册地址{:target="_blank"}) 具体步骤如下: 首先我们需要在 coding 建立一个跟你原来 github 库名完全一致的仓库。例如我的是 sunbufu.github.io{:target="_blank"}。 我们肯定不想发布一个文章的时候,push多次,所以我们需要修改本地 git 的配置文件,添加新的远程仓库地址,使一次 push 可以到多个远程仓库。在你的工程目录里有个隐藏目录 ....

January 14, 2019 · 1 min · sunbufu

authorize(基于注解的权限认证框架)

一、是什么 很多项目都会用到权限管理,目前流行的权限框架(Apache Shiro,Spring Security等)在使用的时候都觉得很繁琐,特别是在一些小型的项目中。有时候我会想,如果通过注解的方式,直接把权限注解到访问的接口方法上那该有多好。 authorize就是一个为了解决这个问题,通过注解配置权限,借助拦截器进行权限检查的一个开源权限框架。使用起来就像下面这种感觉。 @Access("manage") @RequestMapping("index") public String index() { return "this is index page"; } @Access是这个框架的注解。通过注解配置权限的方式,解决权限认证的问题,不管是写代码还是读代码,都感觉更清晰了许多。 二、如何用 2.1 快速使用 可以参照示例authorize-demo 2.1.1 引入maven依赖 <dependency> <groupId>com.github.sunbufu</groupId> <artifactId>authorize-starter</artifactId> <version>1.0.0-RELEASE</version> </dependency> 2.1.2 实现IAuthorizeService 在IAuthorizeService的实现类中,至少应该实现3个方法: 登录方法:登录成功后,把用户信息存放到session中 鉴权方法(authorize):通过比对用户和请求方法的权限,返回该用户是否可以访问 鉴权失败方法(authorizeFail):用户没有权限时,需要进行的处理方法 登录: public User logIn(String userName, String passWord, HttpSession session) { User user = users.get(userName); if (!user.getPassWord().equals(passWord)) { return null; } session.setAttribute(USER_SESSION_KEY, user); return user; } 鉴权: @Override public boolean authorize(String[] access, HttpSession session) { User user = (User) session....

June 13, 2018 · 1 min · sunbufu

Spring Cloud Config 使用本地配置文件

一、简介 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。 二、配置 2.1 Spring Cloud Config Server项目 1 pom.xml中导入Config Server需要的包 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> 2 在Application类中添加@EnableConfigServer注解 package com.sunbufu; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @EnableConfigServer @SpringBootApplication public class ConfigServerApplication { public static void main(String[] args) { SpringApplication.run(ConfigServerApplication.class, args); } } 3 修改配置文件application.yml,指定本地客户端配置文件的路径 spring: profiles: active: native cloud: config: server: native: searchLocations: F:/conf 4 准备客户端配置文件 client-dev.yml文件的内容: server: #设置成0,表示任意未被占用的端口 port: 8081 nickName: world 2....

June 13, 2018 · 1 min · sunbufu