分类 学习笔记 中的文章

学习SpringBoot系列 -03- 使用Druid数据库连接池

SpringBoot 在1.x默认使用的是 Tomcat 连接池; SpringBoot 在2.x默认使用的是 Hikari 连接池; 那么, 如何在SpringBoot工程中使用优秀的 Druid 连接池呢? 关于 Hikari 与 Druid 的那些事,有兴趣的可以这个 issue , 简单来说,各有所长。前者可以认为是个纯粹的数据库连接池,后者同时注重监控、可运维等能力扩展,且有阿里背书,经过大量验证. 1. 添加 Druid 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency> 2. 移除 Hikari 依赖(可选)(建议移除) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> 关于 Druid 的一些配置,这里就不展开了。 借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

学习SpringBoot系列 -02- 多数据源

如何在SpringBoot工程中配置多数据源呢? 1. 排除掉自动引入的数据源相关配置 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class }) public class HelloJdbcApplication { public static void main(String[] args) { SpringApplication.run(HelloJdbcApplication.class, args); } } 2. 新增数据源配置信息 application.properties // 这里以H2演示,后面更新 foo.datasource.url=jdbc:h2:mem:foo foo.datasource.username=sa foo.datasource.password= bar.datasource.url=jdbc:h2:mem:bar bar.datasource.username=sa bar.datasource.password= 3. 新增数据源配置类 3.1 foo 数据源的配置类 @Configuration public class FooDataSourceConfiguration { @Bean @ConfigurationProperties("foo.datasource") public DataSourceProperties fooDataSourceProperties() { return new DataSourceProperties(); } @Bean public DataSource fooDataSource() { DataSourceProperties dataSourceProperties = fooDataSourceProperties(); return dataSourceProperties.initializeDataSourceBuilder().build(); } @Bean @Resource public PlatformTransactionManager fooTxManager(DataSource fooDataSource) { return new DataSourceTransactionManager(fooDataSource); } } 3.……

阅读全文

学习SpringBoot系列 -01- 移除parent依赖

借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如题,常常项目中会要求统一一个 parent 依赖,而SpringBoot工程默认的 parent 是 spring-boot-starter-parent ,那么如何移除掉这个依赖以便使用其他的parent呢?官方已经考虑到这个问题了,很简单,可以这么做: 1. 在 pom.xml 配置文件中,增加下面这段依赖(当前版本号最新是2.1.3,请根据实际需要进行更改) <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 2. 在 pom.xml 配置文件中,更改 build 块的配置如下 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.3.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

perl Setting locale failed, Please check that your locale settings

在Centos把shell改为zsh后,出现了下面这个waring信息,虽不影响使用,但看着实在是烦人. perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). 查了一些资料,可以通过在.zshrc中增加两行配置来解决这个问题 LC_CTYPE=en_US.UTF-8 LC_ALL=en_US.UTF-8 ……

阅读全文

zsh no matches found *

机器用的shell是zsh,在用acme.sh申请Let’s Encrypt通配符证书时,报了这么个错: zsh: no matches found: *.example.com 查了一下,对.zshrc增加下面一行配置即可 setopt no_nomatch ……

阅读全文

Java 反射

万物皆对象,关于反射的一些整理。 类与对象 // Foo类 class Foo { public void sum(int a, int b) { System.out.println(a + b); } } // Foo类的一个实例对象foo Foo foo = new Foo(); 万物皆对象,类也是个对象。foo是Foo的实例对象,那么Foo又是谁的实例对象呢? 是java.lang.Class的对象。任何一个类都是其对象。 那么,怎么表示这个类的实例对象呢? // 1. 第一种表示方式 -> 任何一个类都有一个叫class的静态成员变量 Class c1 = Foo.class; // 2. 第二种表示方式 -> 通过该类的实例对象拿到 Class c2 = foo.getClass; // 3. 第三种表示方式 Class c3 = Class.forName("com.xu42.java.Foo"); 一种通过类的类类型创建类的实例对象的方式 // 可以通过类的类类型(class type)来创建类的实例对象 Foo foo = (Foo) c1.newInstance();//需要Foo拥有无参数的构造方法 java.lang.Class常用的一些方法 // 获取foo实例的public方法(包含父类) Method[] methods = c2.……

阅读全文

Java Jar包运行参数

Java程序编译为Jar包后,使用nohup java [-options] -jar jarfile > LOG_FILE 2>&1 &来后台运行。 本文主要是options参数的配置简单讲解。 假设我们的应用依赖的JDK版本是1.8 假设我们的虚拟机的内存是4196MB(可通过free -m | awk '/Mem/{print $2}'来查看) -server 选择VM -server -Xms -Xmx -Xmn -Xss 设置初始 Java 堆大小,推荐设置为内存的一半大小,这里是2048m 设置最大 Java 堆大小,推荐设置为内存的一半大小,这里是2048m 设置年轻代大小,推荐设置为Xms的3/8,这里是768m 设置 Java 线程堆栈大小,建议256k 详解可以参考这篇文章 -Xms2048m -Xmx2048m -Xmn768m -Xss256k -XX:MetaspaceSize= -XX:MaxMetaspaceSize= XX:MetaspaceSize=推荐设置为Xms的1/4 XX:MaxMetaspaceSize=推荐设置为Xms的1/2 这对参数的详解,可以参考下这篇文章 -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=1024m -XX:SurvivorRatio Eden区与Survivor区的大小比值,推荐8 其他,未完待续………

阅读全文

设计模式学习 - 策略模式

学习、梳理设计模式。 策略模式 由策略接口、多个具体的策略实现、上下文组成。由客户端来选择具体的策略实现。 一个背景,CRM系统内有多种帐号体系:手机号注册的客户、微信授权的客户、微博授权的客户。 一个场景,需要把这些不同帐号体系的ID转换为CRM系统内部的统一UserId。 策略接口及实现 策略接口 public interface UserStrategy { long transform2UserId(String origin); } 手机号客户实现 public class MobileUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 1L; } } 微信客户实现 public class OpenIdUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 3L; } } 微博客户实现 public class WeiBoIdUserStrategy implements UserStrategy { @Override public long transform2UserId(String origin) { return 2L; } } 上下文 public class UserContext { private UserStrategy userStrategy; public UserContext(UserStrategy userStrategy) { this.……

阅读全文

设计模式学习 - 工厂模式

学习、梳理设计模式。 工厂模式 工厂方法模式 根据不同的对象,提供不同的工厂,然后由客户端来选择对应的工厂。这也是与简单工厂模式的不同的地方。 人 接口 public interface People { void speek(); } 男孩 public class Boy implements People { @Override public void speek() { System.out.println("boy"); } } 女孩 public class Girl implements People { @Override public void speek() { System.out.println("girl"); } } 人 工厂 public interface PeopleFactory { People getPeople(); } 男孩 工厂 public class BoyFactory implements PeopleFactory { @Override public People getPeople() { return new Boy(); } } 女孩 工厂……

阅读全文

设计模式学习 - 适配器模式

学习、梳理设计模式。 适配器模式 不兼容的转换为兼容的,为解决兼容问题而生。 实现方式可分为组合方式和继承方式。 举个例子,充电宝只能用二相电供电,但现在只有三相电该怎么办呢? 三相电实例 /** * 三相电 */ public class ThreePlug { public void powerWithThree() { System.out.println("使用三相供电"); } } 二相电接口 /** * 二相接口 */ public interface TwoPlugInterface { /** * 二相电流供电 */ void powerWithTwo(); } 充电宝 /** * 充电宝 */ public class PowerBank { /** * 需要二相供电 */ private TwoPlugInterface twoPlugInterface; public PowerBank(TwoPlugInterface twoPlugInterface) { this.twoPlugInterface = twoPlugInterface; } public void power() { twoPlugInterface.powerWithTwo(); } } 组合方式 我们来定义个三相适配器(接收三相电,对外提供二相电)。……

阅读全文