<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[cknb1的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/cknb1</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; cknb1]]></copyright><item><title><![CDATA[Java LinkedHashMap获取最后一位]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/129730700</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/129730700</guid><author>cknb1</author><pubDate>Thu, 23 Mar 2023 14:47:52 +0800</pubDate><description><![CDATA[在上面的代码中，我们首先创建了一个LinkedHashMap对象，并向其中添加了三个元素。然后，使用for循环遍历LinkedHashMap中的每个元素，并在循环结束后获取最后一个元素的key和value，最后输出这个元素的信息。需要注意的是，在使用LinkedHashMap获取最后一个元素时，需要遍历整个Map集合，因此效率可能会比较低。在Java中，LinkedHashMap是一种可以保持插入顺序的Map集合，它维护了一个双向链表，记录了元素的插入顺序。]]></description><category></category></item><item><title><![CDATA[Java使用策略模式生成不同时期报告]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/129723668</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/129723668</guid><author>cknb1</author><pubDate>Thu, 23 Mar 2023 09:03:44 +0800</pubDate><description><![CDATA[通过使用策略模式，我们可以轻松地生成不同类型的报告。我们只需要定义不同的报告类，然后使用报告生成器类来生成相应的报告即可。这使得我们的代码更加灵活和可扩展。在Java中，使用策略模式可以方便地生成不同时间周期的报告，包括周报告、月报告、季报告和年报告。本文将介绍如何使用策略模式来实现这些报告的生成。]]></description><category></category></item><item><title><![CDATA[JAVA transient关键字]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/107376139</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/107376139</guid><author>cknb1</author><pubDate>Thu, 16 Jul 2020 09:39:40 +0800</pubDate><description><![CDATA[作用
我们都知道一个对象只要实现了Serilizable接口，这个对象就可以被序列化，java的这种序列化模式为开发者提供了很多便利，我们可以不必关系具体序列化的过程，只要这个类实现了Serilizable接口，这个类的所有属性和方法都会自动序列化。
然而在实际开发过程中，我们常常会遇到这样的问题，这个类的有些属性需要序列化，而其他属性不需要被序列化，打个比方，如果一个用户有一些敏感信息（如密码，银行卡号等），为了安全起见，不希望在网络操作（主要涉及到序列化操作，本地序列化缓存也适用）中被传输，这些信息对应]]></description><category></category></item><item><title><![CDATA[springBoot中获取配置文件属性的三种方式]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106927263</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106927263</guid><author>cknb1</author><pubDate>Tue, 23 Jun 2020 17:02:21 +0800</pubDate><description><![CDATA[方式一
使用@Value方式（常用）
@Value("${test.msg}")  
private String msg; 

在yml配置文件中
test :
  msg : hello world

测试如下
 System.out.println(msg);

hello world

方式二
使用Environment方式
@RestController  
public class WebController {  
    @Autowired  
    private Environmen]]></description><category></category></item><item><title><![CDATA[在非spring环境中获取bean对象]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106849444</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106849444</guid><author>cknb1</author><pubDate>Fri, 19 Jun 2020 09:24:42 +0800</pubDate><description><![CDATA[我们知道如果我们要在一个类使用spring提供的bean对象，我们需要把这个类注入到spring容器中，交给spring容器进行管理，但是在实际当中，我们往往会碰到在一个普通的Java类中，想直接使用spring提供的其他对象或者说有一些不需要交给spring管理，但是需要用到spring里的一些对象。这里我总结了两种方式。
方式一
实现BeanFactoryPostProcessor接口
代码如下
@Component
public final class SpringUtils implements B]]></description><category></category></item><item><title><![CDATA[装饰器模式和代理模式的区别]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106683599</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106683599</guid><author>cknb1</author><pubDate>Thu, 11 Jun 2020 10:57:51 +0800</pubDate><description><![CDATA[代理模式和装饰器模式很像，这里用【到咖啡馆喝咖啡】作例子来讲解。
基础实现
定义一个咖啡的接口。
public interface Coffee {
    /**
     * 打印当前咖啡里有什么
     */
    void printMaterial();
}

定义一个苦咖啡的实现。
public class BitterCoffee implements Coffee {
    @Override
    public void printMaterial() {
        Syst]]></description><category></category></item><item><title><![CDATA[JAVA中DCL单例模式]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106504748</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106504748</guid><author>cknb1</author><pubDate>Tue, 02 Jun 2020 20:58:45 +0800</pubDate><description><![CDATA[DCL就是双重检索锁，废话不多说，直接贴代码
public class single{
	//创建可见性实例instace
	private static volatile DoubleCheckedLocking instatace;
	//私有化构造方法
	private static DoubleCheckedLocking (){
	}
	//公共获取实例方法
	public static DoubleCheckedLocking getInstace(){
		//双重验证
		if(instac]]></description><category></category></item><item><title><![CDATA[JAVA静态代理设计模式实现]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106411425</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106411425</guid><author>cknb1</author><pubDate>Thu, 28 May 2020 19:09:29 +0800</pubDate><description><![CDATA[静态模式
要求代理类和被代理类实现公共接口，
public interface Marry{
    void happyMarry();
}

新建一个被代理类，
public class You implements Marry{

    @Override
    public void happyMarry() {
        System.out.println("you and his");
    }
}

**新建一个代理类，**代理类需要写一个被代理对象作为形参的构造方法
class]]></description><category></category></item><item><title><![CDATA[JAVA多线程的两种启动方式]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106386390</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106386390</guid><author>cknb1</author><pubDate>Wed, 27 May 2020 17:22:27 +0800</pubDate><description><![CDATA[在java中，有两种方式实现多线程,一个是继承Thread类，另一个是实现runnable接口，建议用runnable接口的方式，因为java是但继承多实现。
方式一:继承Thread类
代码如下：
public class StartThread extends Thread  {
    @Override
    public void run() {
        for (int i=0;i&lt;9;i++){
            System.out.println("学习 "+i);
]]></description><category></category></item><item><title><![CDATA[JDK8中LocalDate的方法]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106286270</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106286270</guid><author>cknb1</author><pubDate>Fri, 22 May 2020 17:24:19 +0800</pubDate><description><![CDATA[方式一
在yml文件中配置如下
weather:
  city_name: 
  weather_Key: 

然后通过实体类属性中的注解@Value获取yml文件中的属性
	@Value("${weather.city_name}")
    private String cityName;        
    @Value("${weather.weather_Key}")
    private String key;

方式二
自定义配置类
@Data
@Configuration
@Confi]]></description><category></category></item><item><title><![CDATA[mybatisplus乐观锁插件]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106282863</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106282863</guid><author>cknb1</author><pubDate>Fri, 22 May 2020 16:33:02 +0800</pubDate><description><![CDATA[主要适用场景
当要更新一条记录的时候，希望这条记录没有被别人更新
乐观锁实现方式：

取出记录时，获取当前version
更新时，带上这个version
执行更新时， set version = newVersion where version = oldVersion
如果version不对，就更新失败

插件配置
@Bean 
public OptimisticLockerInterceptor optimisticLockerInterceptor() {    
	return new Optimi]]></description><category></category></item><item><title><![CDATA[mybatisplus之逻辑删除]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106273593</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106273593</guid><author>cknb1</author><pubDate>Fri, 22 May 2020 09:53:51 +0800</pubDate><description><![CDATA[开发系统时，有时候在实现功能时，删除操作需要实现逻辑删除，所谓逻辑删除就是将数据标记为删除，而并非真正 的物理删除（非DELETE操作），查询时需要携带状态条件，确保被标记的数据不被查询到。这样做的目的就是避免 数据被真正的删除。
MP就提供了这样的功能，方便我们使用，接下来我们一起学习下。
修改表结构
为tb_user表增加deleted字段，用于表示数据是否被删除，1代表删除，0代表未删除。
ALTER TABLE `tb_user` ADD COLUMN `deleted`  
int(1) NULL]]></description><category></category></item><item><title><![CDATA[如何实现myBatis plus的自定义sql方法]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106242584</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106242584</guid><author>cknb1</author><pubDate>Wed, 20 May 2020 19:24:39 +0800</pubDate><description><![CDATA[mybatisplus是个很好用的插件，相信小伙伴们都知道，在这里，我给大家讲一下它如何自定义自己的sql方法。
编写myBaseMapper继承baseMapper
public interface MyBaseMapper&lt;T&gt; extends BaseMapper&lt;T&gt; {

    //自定义sql方法
    List&lt;T&gt; findAll();
}

AbstractMethod是mybatisplus中注入方法的一个抽象方法，这里，我们需要定义一个方法来继承]]></description><category></category></item><item><title><![CDATA[myBatisPlus主键生成策略分析]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106180208</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106180208</guid><author>cknb1</author><pubDate>Sun, 17 May 2020 20:41:43 +0800</pubDate><description><![CDATA[关于myBatisPlus,相信大部分小伙伴们并不陌生。
myBatisPlus主键生成策略，其实并不复杂。
我们可以在实体类的id上面加一下注解：
	@TableId(type = IdType.AUTO)
	private Long id;

@TableId注解属于myBatisPlus中的,当点开type后会发现
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface]]></description><category></category></item><item><title><![CDATA[SpringBoot访问静态资源详解]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106143652</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106143652</guid><author>cknb1</author><pubDate>Fri, 15 May 2020 15:50:43 +0800</pubDate><description><![CDATA[在springBoot项目中，通常需要存放静态图片。
如需使用静态图片等，则需要代码如下:
resourceAsStream = this.getClass().getClassLoader().
getResourceAsStream("static/weatherImg/" + imgName + ".png");



用来访问静态图片并作为输入流。
文件结构：

至此，就可以成功的获取指定的文件输入流。

...]]></description><category></category></item><item><title><![CDATA[springBoot后端全局Cors跨域问题]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106127041</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106127041</guid><author>cknb1</author><pubDate>Thu, 14 May 2020 19:39:03 +0800</pubDate><description><![CDATA[在前后分离项目中，很容易碰到跨域问题，前端和后端不处于同一端口号。
要想解决这个问题，后端就需要配置全局CORS跨域请求。
代码如下：
package com.****.*****.configuration;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.spring]]></description><category></category></item><item><title><![CDATA[JAVA线程优先级问题详解]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106097835</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106097835</guid><author>cknb1</author><pubDate>Wed, 13 May 2020 14:48:01 +0800</pubDate><description><![CDATA[Java中线程优先级可以指定，范围是1~10。但是并不是所有的操作系统都⽀持10 级优先级的划分（⽐如有些操作系统只⽀持3级划分：低，中，⾼），Java只是给 操作系统⼀个优先级的参考值，线程最终在操作系统的优先级是多少还是由操作系 统决定。
Java默认的线程优先级为5，线程的执⾏顺序由调度程序来决定，线程的优先级会 在线程被调⽤之前设定。
通常情况下，⾼优先级的线程将会⽐低优先级的线程有更⾼的⼏率得到执⾏。我们 使⽤⽅法 Thread 类的 setPriority() 实例⽅法来设定线程的优先级。

p]]></description><category></category></item><item><title><![CDATA[JAVA异常之try、catch、finally用途]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106018238</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106018238</guid><author>cknb1</author><pubDate>Sat, 09 May 2020 14:22:31 +0800</pubDate><description><![CDATA[当try代码块里面发生异常，会被catch所捕获，不会抛出，在catch代码块里面定义异常之后的操作。无论是否异常，finally块的代码始终会执行。
有一种情况，当try或者catch含有return时，finally依旧会执行。

...]]></description><category></category></item><item><title><![CDATA[spring事务回滚]]></title><link>https://blog.youkuaiyun.com/cknb1/article/details/106014994</link><guid>https://blog.youkuaiyun.com/cknb1/article/details/106014994</guid><author>cknb1</author><pubDate>Sat, 09 May 2020 11:14:05 +0800</pubDate><description><![CDATA[被拦截的方法需显式抛出异常，并不能经任何处理，这样Aop代理才能捕获到方法的异常，才能进行回滚，默认情况下Aop只捕获RuntimeExcetpion的异常，但可以通过 配置来捕获特定的异常并回滚换句话说在service的方法中不使用try catch 或者在catch中最后加上throw new RuntimeExcetpion()，这样程序异常时才能被Aop捕获进而回滚
解决方案：
方案1.例如service层处理事务，那么service中的方法中不做异常捕获，或者在catch语句中最后增加throw ]]></description><category></category></item></channel></rss>