- 博客(65)
- 收藏
- 关注
原创 线程池的使用:ExecutorService、CompletionService和CompletableFuture的区别
当我们需要处理批量任务的时候,经常会使用线程池来提高处理速度,但线程池的使用方式有多种,今天主要来介绍一下ExecutorService、CompletionService和CompletableFuture的区别。
2024-09-17 17:03:09
1206
1
原创 mysql可重复读不能解决幻读吗?
可重复读是数据库的四个隔离级别之一,可重复读可以保证在一个事物之内读取到的数据永远是相同的(通过mvcc表快照实现的),哪怕这期间有其它事务对数据做了修改,也不会影响当前事务的查询。
2024-09-07 15:51:36
710
原创 linux死锁问题和cpu使用率过高问题排查
死锁问题和cpu使用率过高都是需要我们找出对应的问题线程。死锁问题需要我们找出哪两个线程出现了死锁情况。cpu使用率过高需要我们找出哪个或哪些线程占用了大量的cpu。
2024-08-24 22:05:38
470
原创 spring事件发布器ApplicationEventPublisher的使用
spring中有一个事件发布器,使用了观察者模式,当有事件发布的时候,事件监听者会立刻收到发布的事件。今天我们来介绍下这个事件发布器怎么使用。
2024-07-18 23:01:56
1518
原创 枚举的高阶用法之枚举里写方法以及注入spring的bean
一般我们使用枚举都是用来定义一些常量。接着再写一下根据name查找对应枚举的方法。然后比如我们的业务场景是这样的:我们有一个OrderTypeService接口及其实现类。根据接口的方法名我们一眼就知道,processPc是用来处理PC订单的;processPhone是用来处理PHONE订单的。然后再实际调用这两个方法的地方就需要我们进行if-else的判断。这里的if-else判断的缺点是:代码扩展性很差,如果以后又增加了其它订单类型,我们还需要改这里的if-else逻辑。
2024-07-14 22:26:42
1568
2
原创 ThreadLocal加切面实现线程级别的方法缓存
实现效果:当一个线程多次请求A方法时,只会触发一次A方法的实际调用,会将方法结果缓存起来,避免多次调用。
2024-04-06 17:51:47
1028
原创 备忘录模式的学习与使用
当您需要在不破坏封装性的前提下保存和恢复对象的状态时,备忘录模式是一种有用的设计模式。备忘录模式允许您将对象的状态保存到备忘录对象中,并在需要时从备忘录中恢复状态。这种模式分离了状态的保存和恢复逻辑,使得对象的状态管理更加灵活和可扩展
2023-07-07 20:00:00
238
原创 中介者模式的学习与使用
中介者模式的核心思想是将对象之间的交互逻辑集中在中介者中,而不是让每个对象都直接与其他对象通信。当一个对象需要与其他对象进行通信时,它只需要通过中介者发送消息,而无需知道具体的目标对象。中介者负责将消息转发给合适的目标对象。
2023-07-05 20:00:00
211
原创 命令模式的学习与使用
当你想要将请求与实际执行操作的对象解耦时,可以使用命令模式。它将一个请求封装为一个对象,从而使你可以根据不同的请求将其参数化,将请求队列或日志请求,并支持可撤销的操作。
2023-07-04 20:00:00
196
原创 原型模式的学习与使用
在原型模式中,我们定义一个原型接口或抽象类,该接口或抽象类定义了克隆方法。具体的原型类实现克隆方法,并根据自身的属性创建新的对象。
2023-07-03 20:00:00
328
原创 外观模式的学习与使用
外观模式(Facade Pattern)是一种结构型设计模式,它通过提供一个统一的接口,封装了一个或多个复杂的子系统,并使其更易于使用。外观模式将系统的复杂性隐藏在一个外观类背后,客户端只需要与外观类进行交互,无需了解底层子系统的复杂实现细节。
2023-07-02 14:38:25
368
原创 桥接模式的学习与使用
桥接模式的核心思想是通过桥接接口(Bridge)将抽象部分和实现部分连接起来。抽象部分和实现部分可以独立地变化,而不会相互影响。这使得系统更加灵活,可以根据需求动态地选择和切换实现部分,同时也方便了系统的扩展和维护。
2023-06-30 18:13:53
364
原创 享元模式的学习与使用
享元模式的核心思想是将对象的状态分为内部状态和外部状态,并共享内部状态以减少对象的数量。这样可以节省内存空间,并提高系统的性能。
2023-06-24 16:34:15
241
原创 单例模式的学习与使用
当我们需要确保一个类只有一个实例并且全局可访问时,可以使用单例模式。单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点以便于其他对象可以使用该实例。选择哪种实现方式取决于具体的需求和场景。在多线程环境下,需要考虑线程安全性和性能。此外,要注意避免单例模式的滥用,因为它可能导致代码的耦合性和可测试性降低。设计一个日志管理器类,要求该类只能有一个实例,并且可以通过全局访问点获取该实例。该日志管理器可以记录系统中的日志信息。
2023-06-09 11:09:13
780
原创 状态模式的学习和使用
状态模式通过将对象的状态封装在不同的状态类中,以实现状态之间的切换和行为的变化。这样,对象可以根据当前状态来选择不同的行为,而无需使用复杂的条件语句
2023-06-08 23:17:42
139
原创 责任链模式的学习与使用
责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。责任链模式将请求的发送者和接收者解耦,使多个对象都有机会处理请求
2023-06-08 11:30:18
578
原创 模板方法设计模式的学习和使用
模板方法设计模式的优势在于提供了一种代码复用的方式,可以避免在每个子类中重复编写相同的代码,同时允许子类在需要的地方提供自定义的实现。这样,模板方法模式实现了算法的核心部分集中管理,同时保留了灵活性。
2023-06-07 23:09:55
655
原创 适配器模式的学习与使用
当我们需要将一个类的接口转换成另一个客户端所期望的接口时,适配器模式(Adapter Pattern)可以派上用场。它允许不兼容的接口之间能够协同工作。
2023-06-03 11:00:00
274
原创 代理模式的学习与使用
jdk动态代理JDK 动态代理基于接口实现。它使用 java.lang.reflect.Proxy 类和java.lang.reflect.InvocationHandler 接口来创建代理对象。首先,定义一个实现 InvocationHandler 接口的代理类,它负责处理代理对象的方法调用。然后,使用 Proxy.newProxyInstance(ClassLoader, Class[], InvocationHandler) 方法创建代理对象,指定类加载器、要代理的接口列表和代理类的实例。
2023-06-01 21:53:49
957
原创 观察者模式的学习与使用
观察者模式的核心思想是:松耦合,将观察者与被观察者解耦,使得它们之间的关系不再是紧密耦合的。这样一来,当被观察者的状态发生变化时,不需要直接调用观察者的方法,而只需要通知(间接调用)观察者即可。:Subject 维护一个观察者列表,并提供注册和删除观察者的方法。Subject 还提供了一个通知方法,当它的状态发生变化时,会通知所有的观察者。使用观察者模式实现这样的功能:假设有一个气象站,每隔一段时间会更新一次气象数据,现在需要实现一个程序,能够实时地获取气象数据并进行显示。
2023-05-30 21:39:58
137
原创 装饰者模式学习与使用以及优缺点
*** @Description: 具体装饰者// 这里可以对初始的颜值sign进行处理 return " 颜值是:" + sign;} }/*** @Description: 具体装饰者// 这里可以对初始的sign进行处理 return " 身高为" + sign;} }/**3. @Description: 具体装饰者// 这里可以对初始的体重sign进行处理 return " 体重为" + sign;} }
2023-05-14 13:14:50
116
原创 策略模式的学习和使用以及和简单工厂模式的区别
**3. @Description: 客户端// 生产女人 PersonContext personWomanContext = new PersonContext(new PersonWomanStrategy());// 生产男人 PersonContext personManContext = new PersonContext(new PersonManStrategy());} }
2023-05-14 10:39:31
106
原创 关于BeanPostProcessor的postProcessBeforeInitialization和InitializingBean的afterPropertiesSet执行顺序的问题和解释
【代码】关于BeanPostProcessor的postProcessBeforeInitialization和InitializingBean的afterPropertiesSet执行顺序的问题和解释。
2023-05-05 09:56:25
1434
原创 一文搞懂PostConstruct和ApplicationContext(ApplicationContextAware)的加载顺序
*说白了就是spring是初始化完一个bean再去初始化另一个bean;所以下面扩展一下这些bean得BeanPostProcessor接口里的方法的执行顺序是怎么样的呢?
2023-04-25 22:48:51
2584
原创 解释一下ThreadLocalMap的value为什么不是弱引用
引用指向值A,那么当Athreadlocal还存在其它强引用的时候,Athreadlocal不会被回收;而值A没有其它强引用,此时值A会被回收掉,当我们再通过Athreadlocal的get方法从ThreadLocalMap中获取值得时候就获取不到了,导致了值A丢失。,那么在当前线程的ThreadLocalMap中就会有一个entry键值对,entry的key是弱引用指向Athreadlocal,entry的value是强引用指向值A。比如现在我们把值A通过set方法放到了Athreadlocal里即。
2023-04-14 14:46:57
823
原创 盛世芳华游戏与微信公众号结合的DDD项目,已接入chatgpt。附源码。
盛世芳华游戏与微信公众号结合的DDD项目,已接入chatgpt。附源码。
2023-03-23 18:11:13
260
原创 java设计模式之抽象工厂模式
    ***设计模式系列***抽象工厂模式    提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。抽象工厂方法模式的四个角色1、抽象工厂:它声明了一组用于创建一族产品的方法,每一个方法对一个一种产品。2、具体工厂:它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中。3、抽象产品:
2020-12-27 16:31:45
164
原创 java设计模式之工厂方法模式
设计模式系列工厂方法模式 工厂方法模式提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。 工厂方法模式的四个角色 1、抽象产品角色:它是定义产品的接口,是工厂方法模式所创建的对象的超类型,也就是产品对象的公共父类。 &
2020-11-29 19:00:03
328
原创 问题记录系列之读取指定配置文件得值时会被application得值(若存在)覆盖掉
问题说明:我想读取a配置文件的里的b的值 但如果application文件里也有b,这时就算我们指定了读取a配置文件最后取到的值还是application里的b的值。 代码举例说明:上面是两个配置文件 接下来我们指定读取onelog这个配置文件接下来是取到的结果可以看到 虽然我们指定了读取onelog配置文件的test的值 但最后的值还是application里的test的
2020-11-23 12:06:46
260
原创 java设计模式之简单工厂模式
设计模式系列简单工厂模式解释:定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的类的实例通常都具有共同的父类。简单工厂模式一般都含有以下三个角色:1.Factory(工厂角色):该模式的核心,负责实现创建所有产品实例的内部逻辑。2.Product(抽象产品角色):它是工厂类创建的所有产品对象的父类。3.ConcreteProduct(具体产品角色):它是简单工厂模式的创建目标,所有被创建的对象都充当这个角色的某个具体类的实例。下面我将以一个例子来说明一下:使用简单工厂模式来模拟女
2020-11-22 17:36:31
266
原创 解决拦截器无法注入bean的问题和springboot读取配置文件map数据
说明:这两个放一起是因为同一个需求里的 ,最近要做一个下载excel的日志记录任务,因为下载Excel是早就做好了的 所以要求对原有方法尽量少的改动。我就想着用拦截器去实现在目标方法执行完之后区进行日志的记录。需要记录下载的文件名 我是把需要拦截的url和文件名放到了配置文件的map里key是url,value是文件名。所以第一个问题就是拦截器无法注入bean@Configurationpublic class AllInterceptor implements WebMvcConfigurer
2020-11-22 14:38:12
434
原创 get方式传递多个参数给实体类或单个参数的写法
1.代码@Datapublic class Stu { private Integer num; private String name;}@SpringBootApplication@RestController@RequestMapping("/CaiNiaoController")public class CaiNiaoController { /** * success * @param num * @return
2020-11-16 12:02:32
6324
原创 Guava的一些基本用法 (持续更新)
20201110内容:首先引入pom文件 com.google.guava guava 11.0.2 代码: public static void main(String[] args) { List<String> list=Lists.newArrayList(); list.add("xiaomi"); list.add("huaw
2020-11-10 11:43:32
378
2
原创 java8的Stream流的一些简单常用方法实例:limit,map,filter和foreach
public class Test { public static void main(String[] args) { //定义一个手机list List<String> phones=new ArrayList<>(); phones.add("小米");phones.add("华为");phones.add("苹果");phones.add("三星");phones.add("魅族"); System.o
2020-11-07 15:00:53
411
原创 Java利用反射将list里的值赋到vo实体类里
**首先贴上代码** private static GxbVO PushVo(List<String> listnr){ GxbVO vo=new GxbVO(); Field[] declaredFields = GxbVO.class.getDeclaredFields(); for(int a=0;a<listnr.size();a++...
2020-04-21 10:06:25
3600
5
原创 日期类型转字符串 oracle和java的区别
## 一、首先看一下在oracle里日期类型转字符串select sysdate,to_char(sysdate, ‘yyyy-mm-dd hh-mm-ss’) “yyyy-mm-dd hh-mm-ss”,to_char(sysdate, ‘yyyy-mm-dd hh-mi-ss’) “yyyy-mm-dd hh-mi-ss”,to_char(sysdate, ‘yyyy-mm-dd h...
2020-01-20 14:50:04
282
原创 使用webmagic模拟post表单提交爬取易查分成绩
使用webmagic模拟post表单提交爬取易查分成绩#不废话直接上图简单来说就是在一图输入学生姓名 点击查询就会跳转到二图,当然这里二图我把班级姓名信息以及去掉了;下面就是分析通过上图我们可以看到点击查询后实际上是发送了一个post表单提交;根据返回回来的结果再跳转到分数结果的地址;所以这里我们就直接使用webmaigc来模仿psot表单提交 把学生姓名提交过去;这是一个请求...
2019-12-14 10:43:13
2677
2
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人