- 博客(39)
- 收藏
- 关注
原创 SpringBoot项目中的异常处理
SpringBoot 默认的处理异常的机制:SpringBoot 默认的已经提供了一套处理异常的机制。一旦程序中出现了异常 SpringBoot 会像/error 的 url 发送请求。在 springBoot 中提供了一个叫 BasicExceptionController 来处理/error 请求,然后跳转到默认显示异常的页面来展示异常信息。
2025-01-22 18:49:55
487
原创 SpringBoot如何实现热部署操作
Control+shift+Alt+/ 选择 Registry 选中打勾 “compiler.automake.allow.when.app.running”。在IDEA中项目热部署通过SpringBoot devtools来实现,因为如果每次我们修改下页面的代码都需要重新启动的话那么效率就太低了。在IDEA中热部署默认是没有放开的,我们需要放开设置,具体如下。
2025-01-21 19:24:52
361
原创 SpringBoot整合篇
在application.properties中添加配置参数,此处要注意SpringBoot2.x版本的参数和1.x版本的参数设置有区别,需要注意。添加获取FilterRegistrationBean对象的方法,并在该方法中注册Filter及配置拦截的请求的URL。创建新的过滤器,不用配置@WebFilter注解,我们同样在启动类中注册过滤器。在我们刚刚创建的templates目录下创建index.html页面,在头部引入。创建启动类,同时创建注册Listener的方法,如下。
2025-01-20 19:11:41
1661
原创 初学SpringBoot
一般情况下,默认目录已经满足我们的需求了,但是在某些特殊的情况下我们可能需要将静态文件存放在特殊的文件夹下,我们可以在application.properties中如下配置#表示所有的访问都经过静态资源路径#覆盖默认配置,所以需要将默认的也加上否则static、public等这些路径将不能被当作静态资源路径然后启动程序,访问测试。
2025-01-17 18:41:26
1545
原创 MyBatis缓存原理及插件实现
invoke方法会对所拦截的方法进行检测,以决定是否执行插件逻辑,当代理对象方法被调用时,执行invoke() 方法。Interceptor翻译过来就是拦截器,也说明它是基于拦截器原理实现的调用interceptor.plugin(target) 方法,返回target经过包装后的对象。因为四大对象在创建的过程中,都实现了拦截器链的处理,我们以StatementHandler为例,遍历它的创建过程,来窥视插件原理。在pluginAll()方法中,获取到了所有的Interceptor。
2025-01-16 18:56:43
1094
原创 MyBatis核心流程
① MyBatis 是一款优秀的持久层框架 [ORM],它支持自定义 SQL、存储过程以及高级映射;② MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作;③ MyBatis 可以通过简单的 XML文件或注解 将Java对象配置和映射为数据库中的记录;Java对象:原始类型、接口和 Java POJO [Plain Old Java Objects 普通老式Java对象]④ MyBatis里面,SQL和代码是分离的,所以会写SQL基本上就会用MyBatis。
2025-01-15 20:36:08
990
原创 Spring5框架之SpringMVC
/*** 处理请求的方法* @return*/@OverrideSystem.out.println("controller 执行了....");@Controller // 将UserController对象交给IoC容器管理@RequestMapping("/user") // 类头部的可以省略/*** 具体处理请求的方法 【头部的mapping+方法的mapping】* @return*/。
2025-01-07 19:26:24
1455
原创 Spring 循环依赖
先从一级缓存singletonObjects中去获取。(如果获取到就直接return)如果获取不到或者对象正在创建中(isSingletonCurrentlyInCreation()),那就再从二级缓存earlySingletonObjects中获取。(如果获取到就直接return)如果还是获取不到,且允许singletonFactories(allowEarlyReference=true)通过getObject()获取。就从三级缓存singletonFactory.getObject()获取。
2025-01-06 19:49:33
1213
原创 SpringAOP
面向切面编程,就是将交叉业务逻辑封装成切面,利用AOP的功能将切面织入到主业务逻辑中。所谓交叉业务逻辑是指,通用的、与主业务逻辑无关的代码,如安全检查、事务、日志等。若不使用AOP,则会出现代码纠缠,即交叉业务逻辑与主业务逻辑混合在一起。这样,会使主业务逻辑变的混杂不清。
2025-01-05 19:21:24
866
原创 Spring IOC
以前没有spring的时候,我们需要得到一个对象,都是自己主动去new一个对象,然后通过set方法给对象注入属性,但是这种动作其实是一个重复的动作,所以spring提供ioc的容器解决方案,在容器启动的时候就把许多需要实例化和属性注入的bean都提前做好并放入到一个map中存储起来。这就是控制反转,原来的控制全在用户,现在的控制权完全交给了容器,在bean实例化后,通过反射对属性进行依赖注入有两种使用方式,一种是xml的方式,一种是注解的方式。
2025-01-04 18:28:09
615
原创 Spring框架之事务管理
定义自定义注解在需要AOP支持的方法上添加该注解@GupaoTx自定义切面类@Aspect@Component/*** 事务处理的前置方法*//*** 后置通知*/System.out.println("提交成功...");/*** 最终通知*/System.out.println("失败回滚....");放开AspectJ的支持测试代码。
2025-01-03 19:20:45
889
原创 Spring启动过程及生命周期
创建前准备回去配置中获取bean有关 的扩展实现比如init-method容器在初始化的时候回调用的一些方法,destroy method容器在销毁bean的时候回调用的一些方法以及beanFactoryPostProcessor 这一类的bean加载过程中的一些前置和后置的一些处理扩展实现,这些类或配置其实是spring提供给开发者用来去实现bean加载过程中的一些扩展,在很多的和spring集成的中间件也比较常见 ,比如像dubbo。创建实例阶段主要是通过反射创建bean的实例对象。
2025-01-02 18:53:07
1097
原创 Spring基本使用
Value 帮助我们给数组动态的设值@Component@Value("bobo") // 注入普通的字符串// 注入操作系统的信息// 注入表达式的结果// 注入其他Bean的属性@Override'}';@ComponentJava配置读取第三方的Properties文件中的信息创建第三方的属性文件在需要引入属性文件中的信息的时候通过@Value注解实现。
2025-01-01 19:14:39
885
原创 Java网络编程
以下用简短的Q&A形式进行总结:Q: HTTPS 为什么安全?因为 HTTPS 保证了传输安全,防止传输过程被监听、防止数据被窃取,可以确认网站的真实性。Q: HTTPS 的传输过程是怎样的?客户端发起 HTTPS请求,服务端返回证书,客户端对证书进行验证,验证通过后本地生成用于改造对称加密算法的随机数,通过证书中的公钥对随机数进行加密传输到服务端,服务端接收后通过私钥解密得到随机数,之后的数据交互通过对称加密算法进行加解密。Q: 为什么需要证书?防止”中间人“攻击,同时可以为网站提供身份证明。
2024-12-31 18:45:30
1409
原创 网络通信协议与NIO
当时作了一个试验,将信息包通过点对点的卫星网络,再通过陆地电缆,再通过卫星网络,再由地面传输,贯串欧洲和美国,经过各种电脑系统,全程9.4万公里竟然没有丢失一个数据位,远距离的可靠数据传输证明了TCP/IP协议的成功。,这个缓冲区你就可以完全把它理解为火车,比如说你现在想把程序中的数据写到文件中,那么你就可以把数据都写到缓冲区,然后缓冲区通过通道进行传输,最后再把数据从缓冲区拿出来写到文件中,你想把文件中的数据传数到程序中,也是一个道理,把数据写到缓冲区,缓冲区通过通道进行传输,到程序中把数据拿出来。
2024-12-30 19:44:00
1766
原创 Unix系统下的5种IO模型
例子:老王去河边钓鱼,不过他有点贪心,一次性使用多个鱼竿钓鱼(假设10个)(不过老王这从使用 的是升级版的鱼竿,每根鱼竿上绑着一个小铃铛,当有鱼上钩时铃铛会响),然后把十个鱼竿放进河 里,因为使用了升级版鱼竿,使用老王不用从左到右盯着鱼竿,但是也什么也干不了,只能那发呆。例子:老王去河边钓鱼,用的终极版鱼竿(自动放进桶里并播放响铃),放下鱼竿后他可以干其他事, 玩游戏,刷微博等,鱼上钩了以后,终极版鱼竿会自动收杆并把鱼放进桶里后,响铃会响,通知老王把 鱼煮了。在Java中,IO流是一种用来读写数据的机制。
2024-12-28 18:17:33
1048
原创 线程池原理
并且,建议大家不要用这些封装的,用底层的 ThreadPoolExecutor,这样你就逼着自己去把线程池的一些参数去搞明 白!能够异步处理任务,并且能处理多个任务,但是无限制的使用线程,线程 之间的创建、销毁,切换,都会带来一定的消耗!所以,为了控制线程的 数量,复用已有线程,同时减少线程切换带来的开销,所以,线程池这种 池化技术就出来了!:返回一个可根据实际情况调整线程个数的线程池,不限制最大线程数量,若 用空闲的线程则执行任务,若无任务则不创建线程。线程的 IO 耗时所占比例越高,就需要越多的线程。
2024-12-27 18:35:30
866
原创 AQS、ReentrantLock、CountDownLacth原理及源码解析
Semaphore(信号量),是JUC包下的一个工具类,我们可以通过其限制执行的线程数量,达到限流的效果。当一个线程执行时先通过其方法进行获取许可操作,获取到许可的线程继续执行业务逻辑,当线程执行完成后进行释放许可操作,未获取达到许可的线程进行等待或者直接结束。
2024-12-26 19:16:35
1275
原创 线程的安全、volatile、synchronized
synchronized中文意思是同步,也称之为”同步锁“。synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。在JDK1.5之前synchronized是一个重量级锁,相对于j.u.c.Lock,它会显得那么笨重,随着对synchronized进行的各种优化后,synchronized并不会显得那么重了。
2024-12-24 20:00:20
1428
原创 线程的概念及基本应用
interrupt() 是给线程设置中断标志interrupted() 是检测中断并清除中断状态isInterrupted() 只检测中断。还有一点就是interrupted()作用于当前线程和作用于此线程,即代码中调用此方法的实例所代表的线程。
2024-12-23 20:10:54
990
原创 Hashtable 描述及源码解析
/ 默认容量// 最大容量// 默认加载因子// 容量// 加载因子// 元素个数// 存储元素的数组// 修改次数// 内部类,哈希表的节点V value;
2024-12-22 20:11:41
771
原创 TreeMap源码解析
如果创建TreeMap时未提供自定义的比较器(Comparator),则TreeMap使用键的自然顺序(即键类实现的Comparable接口的排序顺序)进行排序。TreeMap的插入方法put是将新的键值对插入到红黑树中,并保持红黑树的平衡。TreeMap的删除方法remove是从红黑树中删除指定的键值对,并保持红黑树的平衡。TreeMap中有几个关键的成员变量,包括红黑树的根节点root、用于比较key的比较器comparator、TreeMap的大小size以及修改计数modCount等。
2024-12-21 19:51:22
860
原创 LinkedHashMap
/ 双向链表的头节点// 双向链表的尾节点// 访问顺序的标志// LinkedHashMap的内部类,继承自HashMap的内部类Node。
2024-12-20 16:48:03
562
原创 java集合-Map HashMap 源码解析
HashMap是基于哈希表实现的,每一个元素是一个key-value对,无序,不可重复。HashMap是非线程安全的,只是用于单线程环境下,多线程环境下可以采用concurrent并发包下的concurrentHashMap。HashMap 实现了Serializable接口,因此它支持序列化,实现了Cloneable接口,能被克隆。
2024-12-19 17:59:37
826
原创 java集合-set HashSet、LinkedHashSet 和 TreeSet
在Java中,Set是一种集合框架()中的接口,它继承自Collection接口。Set接口的实现类不允许存储重复的元素,并且不保证集合的迭代顺序。Set接口中常用的实现类包括HashSet和TreeSet。:HashSet的底层实现是。在HashSet中,每个元素都会作为HashMap的键(key),而值(value)则使用一个常量对象PRESENT。所有的HashSet共享同一个PRESENT对象。:LinkedHashSet的底层实现是。
2024-12-18 17:36:12
1034
原创 JAVA集合-LIST 及源码解析
LinkedList类是一个实现了List接口的类,它使用了一个静态内部类Node来表示链表中的节点。Node类包含三个属性:item(存储节点的数据)、prev(指向前一个节点的指针)和next(指向下一个节点的指针)。size:表示链表中元素的个数。first:指向链表的头节点(head)。last:指向链表的尾节点(tail)。
2024-12-17 17:47:39
2843
原创 Java设计模式及示例
抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。抽象工厂模式的核心思想是将客户端与具体产品的创建过程解耦,使得客户端可以通过工厂接口来创建一族产品。它通常涉及一族相关的产品,每个具体工厂类负责创建该族中的具体产品。这样,当需要增加新的产品族时,只需增加新的具体工厂和产品类,而无需修改现有代码,从而提高了系统的可扩展性和灵活性。
2024-12-16 15:20:27
1424
原创 jvm 程序监控与调优
Class Name:类名称,java类名 Objects:类的对象的数量,这个对象被创建了多少个Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用 Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和。右击类名--->List Objects--->with incoming references--->列出该类的实例。比如-XX:Ratio=4,则表示新生代:老年代=1:4,也就是新生代占整个堆内存的1/5。
2024-12-15 16:30:42
1069
原创 一文了解垃圾回收算法、垃圾收集器
由于Finalizer线程优先级相较于普通线程优先级要低,而根据Java的抢占式线程调度策略,优先级越低的线程,分配CPU的机会越少,因此当多线程创建重写finalize方法的对象时,Finalizer可能无法及时执行finalize方法,Finalizer线程回收对象的速度小于创建对象的速度时,会造成F-Queue越来越大,JVM内存无法及时释放,造成频繁的Young GC,然后是Full GC,乃至最终的OutOfMemoryError。从上图可以看出,没有进行垃圾回收之前,内存占用11960K。
2024-12-14 14:56:40
2608
原创 JVM——运行时数据区
当前放对象的Survivor区域里(其中一块区域,放对象的那块S区),一批对象的总大小大于这块Survivor区域内存大小的50%(-XX:TargetSurvivorRatio可以指定),那么此时大于等于这批对象年龄最大值的对象,就可以直接进入老年代了,例如Survivor区域里现在有一批对象,年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代。在编译期间呢,由于每一个方法的源码都是确定的,而栈帧是根据方法的调用来产生的。
2024-12-13 19:38:57
1191
原创 JVM --深入理解Java虚拟机
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符 7 类符号引用进行。符号引用可以理解成上面讲的那14种常量的名字等等。直接引用就是内存中的真实地址。当解析步骤完成意味着整个连接部分的完成,这也就是说加载外部的java类已经成功的引入到我们的java虚拟机中了。只有加载步骤中的读取二进制流与初始化部分,能被上层开发者,也就大部分的Java程序员控制,而剩下的步骤,都是由JVM去掌控,其中的细节是由JVM开发人员处理,对于上层开发者者是一个黑盒。
2024-12-12 19:44:41
1253
原创 BCryptPasswordEncoder 加密使用
BCryptPasswordEncoder方法采用SHA-256 +随机盐+密钥对密码进行加密。
2024-12-06 14:35:20
1063
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅