<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[a_c_c_a的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/a_c_c_a</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; a_c_c_a]]></copyright><item><title><![CDATA[Redis-Cluster使用示例]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/123302194</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/123302194</guid><author>a_c_c_a</author><pubDate>Sat, 05 Mar 2022 23:29:21 +0800</pubDate><description><![CDATA[redis主从集群环境的使用示例]]></description><category></category></item><item><title><![CDATA[Java中wait、notify、signal的区别]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/122444257</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/122444257</guid><author>a_c_c_a</author><pubDate>Wed, 12 Jan 2022 21:28:33 +0800</pubDate><description><![CDATA[wait与notify、notifyAll：

    --属于Object类的方法，一个对象只能提供一个同步控制

-- 与synchronize搭配使用

wait与signal、signalAll：

-- 属于Condition类的方法，一个锁可以提供多个Condition同步控制

-- 与Lock.lock()、unlock()搭配使用

以生产者消费者为例，说明两者的使用情景


/**
 * 生产者父类
 */
public abst...]]></description><category></category></item><item><title><![CDATA[使用java进行SSL证书的签名与签验]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/122416953</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/122416953</guid><author>a_c_c_a</author><pubDate>Tue, 11 Jan 2022 22:34:08 +0800</pubDate><description><![CDATA[一、签名与签验的含义
签名：客户端使用私钥对字符串加密，得到一个加密后的字符串
签验（签名验证）：服务端使用公钥对字符串加密，验证加密后的字符串是否和客户端签名后一样
二、创建私钥、证书等文件
在linux中执行一下命令，生成所需的各个文件

1.手动生成私钥pri.key
openssl genrsa -des3 -passout pass:123456 -out pri.key 2048

2.生成pkcs8
openssl pkcs8 -topk8 -in pri.key...]]></description><category></category></item><item><title><![CDATA[struts2 在jdk11环境下报404错误的问题解决]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/118552016</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/118552016</guid><author>a_c_c_a</author><pubDate>Wed, 07 Jul 2021 17:33:34 +0800</pubDate><description><![CDATA[首先说明一下，struts2报404的情况很多，不一定你的问题和我的问题一样。要先判断是不是同一个问题。

    我这里的struts2版本是2.5.18。struts2报404，是因为日期格式参数在jdk11环境下解析失败。

    假如你在前台有一个日期参数A，A格式是字符串的日期，如“2021-05-01 00:00:00”,然后对应后台接收的参数不是String，而是Timestamp，那这时候struts2就需要进行类型转换。

struts2...]]></description><category></category></item><item><title><![CDATA[sigar在win10+jdk11环境下崩溃]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/117668026</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/117668026</guid><author>a_c_c_a</author><pubDate>Mon, 07 Jun 2021 17:20:24 +0800</pubDate><description><![CDATA[sigar.jar架包在采集cpu信息的时候，如果java的运行环境是win10+jdk11的话，java会崩溃

错误信息如下


EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00000000100147c4, pid=3844, tid=1044


]]></description><category></category></item><item><title><![CDATA[使用SpringAOP来捕获异常]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/106061934</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/106061934</guid><author>a_c_c_a</author><pubDate>Mon, 11 May 2020 20:41:33 +0800</pubDate><description><![CDATA[当我们在开发程序的时候，经常遇到方法抛异常，而有时候异常打印出来的信息又不够完整，这时候，可以通过AOP，自动在抛异常的时候将方法传入的参数给打印出来。

实现步骤：

1.自定义注解作为连接点（当然也可以用其他方式指定连接点，我觉得使用注解是个不错的注意）

2.定义一个AOP切面

3.在需要捕获异常的方法上面，添加注解



自定义注解


/**
 * 异常自动捕获
 * 注解在方法上，当方法中抛出异常的时候，打印出方法以及方法的参数，方便排查
 * @see ExceptionCatchAop
.]]></description><category></category></item><item><title><![CDATA[使用SpringAOP统计运行时间]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/106061701</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/106061701</guid><author>a_c_c_a</author><pubDate>Mon, 11 May 2020 20:26:40 +0800</pubDate><description><![CDATA[实现步骤只需要3步：

1.自定义注解

2.定义一个AOP切面

3.在需要统计时间的方法上，添加注解。



自定义一个注解。使用value来定义方法的名称，方便读日志。定义一个阈值，运行时间超过阈值，才会记录下来。


/**
 * 统计方法运行的时间，单位毫秒
 * @see CountTimeAop
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface C.]]></description><category></category></item><item><title><![CDATA[@Cacheable有效性检查]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/106061301</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/106061301</guid><author>a_c_c_a</author><pubDate>Mon, 11 May 2020 20:12:23 +0800</pubDate><description><![CDATA[在使用springboot开发项目的时候，我们经常会用到缓存，一般就是通过注解@Cacheable来进行缓存设置。

我们代码是写了@Cacheable，我们以为能生效，但有时候因为一些原因，导致缓存不生效，程序也能正常运行，而我们却蒙在鼓里。如果是redis，虽然可以通过客户端去登录服务器查看有没有缓存，但也十分麻烦。

为了省点事，所以想到使用AOP来自动进行缓存检查，如果没有生效，就打印一些信息提示我们。

实现步骤很简单，只需要在springboot工程中添加上一个AOP类即可，并在配置文件中添加c]]></description><category></category></item><item><title><![CDATA[使用AOP+mybatis+分页插件PageHelper分批查询数据库]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/106060621</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/106060621</guid><author>a_c_c_a</author><pubDate>Mon, 11 May 2020 19:32:01 +0800</pubDate><description><![CDATA[有时候，数据库中的内容太多，无法一次查询出来，这时候就需要分批查询。如果在每个需要分批查询的地方，都去修改原来的代码，实现分批，这样会很麻烦。而Mybatis的分页插件，正好可以配合AOP来进行无侵入式分页，不需要修改原有的代码。下面介绍一下实现步骤：

环境：springBoot+mybatis

1.在工程中引入mybatis的分页插件


compile("com.baomidou:mybatis-plus-boot-starter:2.3")
compile group: 'com.github.p]]></description><category></category></item><item><title><![CDATA[非侵入式mybatis多数据库切换实践]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/106059976</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/106059976</guid><author>a_c_c_a</author><pubDate>Mon, 11 May 2020 19:04:31 +0800</pubDate><description><![CDATA[环境：springboot+mybatis

数据库：mysql+oracle

需求：一个程序中，一部分数据从mysql中查，一部分数据从oracle中查。使用AOP来实现数据库动态切换

参考网上的mybatis动态数据源，并额外扩展使用AOP

步骤：

1.先定义不同的数据库连接类型，用来表示mysql数据库和oracle数据库，如果还有多个数据库，继续定义（这里cms表示oracle数据库，hms表示mysql数据库）


public enum  DataSourceTypeEnum {
  .]]></description><category></category></item><item><title><![CDATA[记录一次Java内存溢出排查过程]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/105710541</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/105710541</guid><author>a_c_c_a</author><pubDate>Thu, 23 Apr 2020 17:32:02 +0800</pubDate><description><![CDATA[这两天公司的一个程序出现问题，频繁出现内存溢出错误OutOfMemory:GC overhead limit exceeded.

虽然知道这个错误的原因是因为Java虚拟机在频繁进行垃圾回收，使用了98%的时间进行垃圾回收，但是实际回收了不到2%的内存。但结合到代码中，还是无法知道为什么会出现这个问题。

程序的内存设置为3G，6G都不行，快的话10分钟就内存溢出。没有办法，只能给Java程序加...]]></description><category></category></item><item><title><![CDATA[Failed to get nestedarchive for entry BOOT-INF/lib/axis2-1.6.2.pom]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/105052993</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/105052993</guid><author>a_c_c_a</author><pubDate>Mon, 23 Mar 2020 17:24:23 +0800</pubDate><description><![CDATA[gradle工程使用bootjar打包出jar之后，使用java -jar命令运行jar，然后程序报错


Exception in thread "main" java.lang.IllegalStateException: Failed to get nestedarchive for entry BOOT-INF/lib/axis2-1.6.2.pom
        at org.spri...]]></description><category></category></item><item><title><![CDATA[hibernate报错 Parameter index out of range (2 > number of parameters, which is 1)]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/104844964</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/104844964</guid><author>a_c_c_a</author><pubDate>Fri, 13 Mar 2020 17:15:07 +0800</pubDate><description><![CDATA[今天遇到一个hibernate报错，在查询的时候，报了一个错误

org.hibernate.HibernateException: java.sql.SQLException: Parameter index out of range (2 &gt; number of parameters, which is 1)

然后我把sql语句和传递的变量都反复查了很多遍，sql里面明明只有一个问号，...]]></description><category></category></item><item><title><![CDATA[tomcat 启动失败，提示循环引用]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/104612024</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/104612024</guid><author>a_c_c_a</author><pubDate>Mon, 02 Mar 2020 15:09:07 +0800</pubDate><description><![CDATA[tomcat启动的时候，提示如下的错误



java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/web...]]></description><category></category></item><item><title><![CDATA[JAVA数组深拷贝实现代码]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/103807499</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/103807499</guid><author>a_c_c_a</author><pubDate>Thu, 02 Jan 2020 17:15:28 +0800</pubDate><description><![CDATA[在使用org.apache.commons.lang.ArrayUtils进行数组拷贝的时候，发现其只能实现数组的浅拷贝，而且不支持泛型

经过改造，我自己重新实现了数组的深拷贝，同时支持多重数组拷贝。

因为Object的clone方法声明成protected，在使用泛型的时候，无法调用clone方法，所以我们自己重新定义个克隆的接口


package demo;

public interf...]]></description><category></category></item><item><title><![CDATA[log4j2 配置文件样例]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/103767964</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/103767964</guid><author>a_c_c_a</author><pubDate>Mon, 30 Dec 2019 16:22:40 +0800</pubDate><description><![CDATA[提供一个log4j2的配置文件样例，样例会把日志按照级别，分别打印在各自的文件中，并且按照每天进行划分，每天最多分割10个文件。另外，还有一个单独的日志，会记录特定的日志。

样例代码如下


import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main ...]]></description><category></category></item><item><title><![CDATA[《HeadFirst设计模式》迭代器和组合模式的错误原因分析和解决办法]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/103688753</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/103688753</guid><author>a_c_c_a</author><pubDate>Tue, 24 Dec 2019 21:11:54 +0800</pubDate><description><![CDATA[关于《HeadFirst设计模式》一书中，迭代器和组合模式中有一部分代码是错误的，错误的类是CompositeIterator，使用这个类，再打印素食菜单的时候，有一些菜单会被重复打印。

如以下菜单


菜单：
	早餐:[豆浆，馒头，玉米]
	午餐:[烧腊，荷叶饭]
	晚餐:[面，粉
		加料:[萝卜，咸菜,
			加料2:[萝卜2，咸菜2]
		]
	]

在这个菜单中，如果使用书中的代码打印...]]></description><category></category></item><item><title><![CDATA[tomcat启动闪退解决方法]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/103669593</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/103669593</guid><author>a_c_c_a</author><pubDate>Mon, 23 Dec 2019 18:46:50 +0800</pubDate><description><![CDATA[有时候，我们在启动tomcat的时候，tomcat的cmd窗口会闪退，这样我们就看不了闪退原因。

这时，我们可以修改tomcat的启动文件来让cmd窗口停下来。

操作如下：

1.用文本方式打开tomcat的startup.bat文件，在最后一行输入pause



2.还是startup.bat，找到call "%EXECUTABLE%" start %CMD_LINE_ARGS%

修改...]]></description><category></category></item><item><title><![CDATA[Spring security后台使用自定义注解进行权限控制]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/103245736</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/103245736</guid><author>a_c_c_a</author><pubDate>Mon, 25 Nov 2019 21:44:00 +0800</pubDate><description><![CDATA[最近在使用spring security进行编码，在实际使用的过程中，遇到的问题记录一下。

背景：在一个项目中，我使用spring security进行权限控制。不仅前台控制页面和按钮的显示，还在后台对没有权限的请求进行过滤。因为每个需要进行权限控制的后台请求，都需要写相同的代码，如果一个两个还好，写多了就开始想能不能减少代码量。

先看看没有使用自定义注解的时候是怎么在后台进行权限控制的


...]]></description><category></category></item><item><title><![CDATA[springSecurity重定义Bad credentials信息]]></title><link>https://blog.youkuaiyun.com/a_c_c_a/article/details/103108398</link><guid>https://blog.youkuaiyun.com/a_c_c_a/article/details/103108398</guid><author>a_c_c_a</author><pubDate>Sun, 17 Nov 2019 14:25:46 +0800</pubDate><description><![CDATA[Springboot整合了SpringSecurity进行登录控制

在实际使用的过程中，发现用户密码如果输错了，界面会提示“Bad credentials”



这个提示可能不明显，我们需要重定义这个提示信息

这时候，我们可以通过定义messge配置文件来修改



1.在代码中配置一个bean，这个bean指定国际化资源文件


@Bean
public ReloadableResour...]]></description><category></category></item></channel></rss>