自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(40)
  • 收藏
  • 关注

原创 IntelliJ IDEA工具的常用快捷键使用

9.怎么快速生成 setter 和 getter 方法: alt + insert ,然后选择 setter and getter 生成。9.在 IDEA 当中如何自动纠错:将光标移动到错误的位置,按 atl + enter。3.查看源码:按 ctrl 别松手,鼠标移动到对应的类名下方,出现下划线,点击过去,可以查看类源码。8.怎么快速生成构造方法: alt + insert ,然后选择 Constructor。11.怎么快速重写方法?4.多行编辑:按 alt 别松手,鼠标拖动多行,完成多行编辑。

2024-05-23 11:19:34 145

原创 什么是三次握手和四次握手

总的来说,三次握手确保了双方都有发送和接收数据的能力,而四次挥手则确保了双方都完成了数据的发送和接收,连接得以安全终止。三次握手和四次挥手是TCP协议中用于建立和终止TCP连接的重要机制。

2024-04-15 09:07:55 689

原创 2024.04.15 Java面试题总结

设置线程为守护线程,可以使用join()合并线程。8.以下哪种I/O不需要应用线程从内核缓冲区的数据读取到应用程序的缓冲区()A.Serializable(串行化):可避免脏读、不可重复读、幻读的发生。C.Read committed(读已提交):可避免脏读、不可重复读的发生。A.在启动线程start()前使用setDaemon(true)C.在启动线程start()后使用setDaemon(true)B.在启动线程start()前使用join();D.synchronize不保证线程的原子性。

2024-04-15 09:00:01 447 1

原创 Redis和Mysql如何保证数据一致性?

如果先更新数据库再更新缓存,如果缓存更新失败就会导致数据库和Redis中的数据不一致,如果先删除缓存再更新数据库,在理想情况下应用下次访问Redis的时候,发现Redis中的数据是空的,就从数据库中加载保存到Redis中,那么数据看起来就是一致的,但是在极端情况下由于删除Redis和更新数据库这两个操作并不是原子的,所以这个过程中如果有其他线程来访问还是会存在数据不一致的问题,所以如果需要在极端情况下仍然保证Redis和Mysql中的数据一致性就只能采用最终一致性方案。1.先更新数据库再更新缓存。

2024-04-08 09:26:17 331 1

原创 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

Mybatis仅支持association关联对象和collection关联集合对象的延迟加载,association指的就是一对一,collection指的就是一对多查询。在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false。 它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB()是null值,那么就会单独发送事先保存好的查询

2024-03-29 10:57:14 150

原创 Mybatis是如何进行分页的?分页插件的原理是什么?

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页,可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。 分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。 举例:select * from student,拦截sql后重写为:select t.* from (sele

2024-03-29 10:54:42 195

原创 IO流主要有哪些?

2.Outputstream(字节输出流)1.Inputstream(字节输入流)3.Reader(字符输入流)4.Writer(字符输出流)转换流:(将字节流转换成字符流)

2024-03-27 09:09:42 156

原创 Mybatis框架是如何实现分页的

逻辑分页:将所有数据查询出来,再在内存中进行分页处理。3.使用PageHelper进行分页(物理分页)4.使用RowBounds进行分页(逻辑分页)1.自己编写sql语句进行分页(物理分页)物理分页:直接在数据库中进行分页。2.使用拦截器进行分页(物理分页)

2024-03-22 16:55:36 87

原创 Spring Boot为什么默认使用CGLIB动态代理

1. CGLIB 动态代理可以代理任何类型的目标类,无论它是否实现了接口;[注意的是,类被 final 修饰,那么该不可被继承,即不可被代理;同样,类中 final 修饰的方法,该方法也不可被代理;3.即 CGLIB 动态代理可以覆盖 JDK 动态代理的所有场景,而 JDK 动态代理不能覆盖 CGLIB 动态代理的所有场景;Bean (无论它是否实现了接口), SpringBoot 默认使用 CGLIB 作为代理的实现方式;2.JDK 动态代理只能代理实现了接口的目标类;

2024-03-21 22:15:18 383

原创 如何实现自己的Spring Boot Starter

2、写一个真正实现自动装配逻辑的项目,在项目 classpath 下写一个 META - INF / spring . factories 文件;6、在 xxxConfiguration 类中编写具体代码实现自动化配置,给使用者把该配的配置好,让别人可以直接使用;1、写一个 starter 项目,一般是一个空壳,里面不写代码,主要起到依赖其他项目的作用;4、 xxxConfiguration 类需要添加注解@ Configuration;

2024-03-21 21:41:56 314

原创 Spring中value的#和$区别

:#{}用来对属性进行赋值使用的,可以为属性赋值 String int等,可以为属性赋值、引用类型 相当于@AutoWirede其实来自 spring 模块 SpEL spring 的表达式语言,与@AutoWired 相似,只是根据里面指定的名称进行搜索搜索到了名称对应的 bean,则执行注入操作。例如:操作系统、JVM 环境、属性文件(properties)等等。这些环境都是以键值对的形式保存的,通过相应的 key 来取得具体的 value 值,也就是环境信息。

2024-03-11 13:33:01 610

原创 Spring中@Component和@Bean的区别

从二者对比来看:@Component 使用较多,因为使用更简单@Bean 注册 bean 的形式更加的集中,可以将这个配置类(@Configuration类)当做早期的纯xm1配置文件,如果对于某个类的bean的生产比较麻烦,需要做N多预处理工作,那么使用@Bean 形式比较妥当。@Bean用于注册 bean的,是一种显示标明的 bean←注册 bean 与类型是完全分开进行管理的,便于统一管理操作同时这个注解是标识在方法上的,我们也可以利用这个提供对象的方法来进行其他业务的扩展“功能性更强。

2024-03-11 13:27:07 518

原创 @Component和@Bean的区别

Bean注册 bean的形式更加的集中,可以将这个配置类(@Configuration类)当做早期的纯xml 配置文件,如果对于某个类的bean的生产比较麻烦,需要做N多预处理工作,那么使用@Bean形式比较妥当。注解类和bean 之间是存在隐性的映射关系的,一个类对应一个注册的bean-@Component、@Bean都是使用注解的形式来定义bean,从功能上讲是一样的。这种方式对于需要逻辑处理是有弊端的,纯粹是一种声明式注册 bean的手段。@Bean用于注册bean的,是一种显示标明的bean。

2024-03-06 12:32:40 531

原创 Spring中有哪些方式可以把Bean注入到IOC容器

3.使用@Configuration注解声明配置类,并使用@Bean注解实现Bean的定义,这种方式其实是xml配置方式的一种演变,是Spring迈入到无配置化时代的里程碑。5.使用FactoryBean工厂bean,动态构建一个Bean实例,Spring CloudOpenFeign里面的动态代理实例就是使用FactoryBean来实现的。1. 使用 xml的方式来声明Bean的定义,Spring容器在启动的时候会加载并解析这个xml,把bean装载到I0C容器中。

2024-03-01 15:47:30 594

原创 SpringBoot中自动装配机制

其实自动装配的思想在SpringFramework3.X版本里面的@Enable注解就已经有了实现的一个雏形,@Enable注解是一个模块驱动的意思,也就是说我们只需要增加@Enable注解就能自动打开某个功能,而不需要针对这个功能去做Bean的配置,@Enable注解的底层也是去帮我们自动去完成这样一个模块相关Bean的注入。自动装配简单来说,就是自动去把第三方组件的Bean装载到IoC容器里面,不需要开发人员再去写Bean相关的一个配置。

2024-03-01 15:34:14 667

原创 从java的语言特性来分析Java的反射机制

Java的反射机制是指在运行时,程序可以检查、获取和操作自身的结构,比如类、接口、字段和方法等。反射机制在一定程度上迎合了这些特性,允许程序在运行时动态地获取和操作类的信息,从而实现更灵活的对象创建、方法调用和属性访问等功能。反射机制允许程序在运行时检查类的结构,获取类的信息,并实例化对象、调用方法和访问属性等。这为实现插件化架构和动态扩展功能提供了可能。综上所述,Java的反射机制通过运行时的类信息检查和操作,使得程序具备了更高的灵活性和动态性,但同时也需要开发人员谨慎使用,以确保程序的安全性和性能。

2024-02-28 21:52:05 464

原创 普通jar和SpringBootjar的区别

Spring Boot JAR 是基于 Spring Boot 框架的一种特殊类型的 JAR 文件。Spring Boot 是一个用于创建独立的、生产级别的 Spring 应用程序的框架,它封装了许多常见的配置和依赖项,使得开发人员能够更轻松地构建和部署应用程序。普通的 JAR 文件通常不包含应用程序的依赖项,因此在运行时,必须确保这些依赖项位于 JVM 的类路径上。:普通 JAR 需要确保运行时的类路径正确设置,而 Spring Boot JAR 包含了应用程序的运行时环境,可以直接作为可执行文件运行。

2024-02-26 16:35:10 914

原创 SpringMVC支持的默认参数类型

这些类型只要写在方法参数中就可以使用了。

2024-01-10 14:16:33 404

原创 SpringMVC的四种跳转方式

默认的跳转是请求转发,直接跳转到jsp页面展示,还可以使用框架提供的关键字redirect:,进行一个重定向操作,包括重定向页面和重定向action,使用框架提供的关键字forward:,进行服务器内部转发操作,包括转发页面和转发action。当使用redirect:和forward:关键字时,视图解析器中前缀后缀的拼接就无效了。

2024-01-10 12:49:00 711

原创 SpringMVC中五种数据提交的方式

3.动态占位符提交(仅用于超链接):使用框架提供的一个注解@PathVariable,将请求url中的值作为参数进行提取,只能是超链接。restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。5.使用HttpServletRequest对象提取:在方法参数中声明一个request对象,使用request的getParameter()获取表单提交的数据,这样得到的数据还要手工进行数据类型的转换。

2024-01-09 22:07:23 587

原创 事务隔离级别

.读未提交: READ _ UNCOMMITTED ,这种隔离级别,存在脏读问题,所谓的脏读( dirty read )表示能够读取到其它事务未提交的数据。.可重复读: REPEATABLE READ ,解决了不可重复读,可以达到可重复读效果,只要当前事务不结束,读取到的数据一直都是一样的。.读提交: READ COMMITTED ,解决了脏读问题,其它事务提交之后才能读到,但存在不可重复读问题。.脏读:读取到没有提交到数据库的数据,叫做脏读。数据库中读取数据存在的三大问题:(三大读问题)

2024-01-07 15:21:09 378 1

原创 Spring对事物的支持

【有事务的话,就在这个事务里再嵌套一个完全独立的事务,嵌套的事务可以独立的提交和回滚,没有事务就和 REQUIRED 一样。* 什么是事物的传播行为:在 service 类中有 a ()方法和 b ()方法, a ()方法上有事务,b()方法上也有事务,当 a ()方法执行过程中调用了b()方法,事务是如何传递的?. REQUIRESNEW :开启一个新的事务,如果一个事务已经存在,则将这个存在的事务挂起【不管有没有,直接开启一个新事务,开启的新事务和之前的事务不存在嵌套关系,之前事务被挂起】

2024-01-06 17:44:19 463 2

原创 Java中项目事物概述

在一个业务流程当中,通常需要多条 DML ( insert delete update )语句共同联合才能完成,这多条 DML 语句必须同时成功,或者同时失败,这样才能保证数据的安全。第三步:提交事务(如果核心业务处理过程中没有出现异常)( commit transaction )B 一致性:事务要求要么同时成功,要么同时失败。C隔离性:事务和事务之间因为有隔离性,才可以保证互不干扰。多条 DML 要么同时成功,要么同时失败,这叫做事务。A 原子性:事务是最小的工作单元,不可再分。

2024-01-06 15:02:58 360 1

原创 面向切面编程(AOP)

Spring 在这两种动态代理中灵活切换,如果是代理接口,会默认使用 JDK 动态代理,如果要代理某个类,这个类没有实现接口,就会切换使用 CGLIB。* 用一句话总结 AOP :将与核心业务无关的代码独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式应用到业务流程当中的过程被称为 aop。.第一:交叉业务代码在多个业务流程中反复出现,显然这个交叉业务代码没有得到复用。.第二:程序员无法专注核心业务代码的编写,在编写核心业务代码的同时还需要处理这些交叉业务。通知又叫增强,就是具体你要织入的代码。

2024-01-05 21:16:07 336 1

原创 动态代理模式

JDK动态代理只能代理接口,底层会生成一个代理类,代理类是实现某个接口的。CGLIB动态代理既可以代理接口,又可以代理类,底层采用继承的方式实现。CGLIB动态代理的功能更强大,效率更高。

2024-01-05 17:35:48 644 1

原创 GoF代理模式

是一个强大的,高性能,高质量的 Code 生成类库,它可以在运行期扩展 Java 类与实现 lava 接口。它既可以代理接口,又可以代理类,底层是通过继承的方式实现的。动态代理还是代理模式,只不过添加了字节码生成技术,可以在内存中为我们动态的生成一个 class 字节码,这个字节码就是代理类。在内存中动态的生成字节码代理类的技术,叫做:动态代理。在程序运行阶段,在内存中动态生成代理类,被称为动态代理,目的是为了减少代理类的数量。. JDK 动态代理技术:只能代理接口。可以使用动态代理来解决这个问题。

2024-01-05 15:17:10 579 1

原创 GoF之代理模式

第二个作用:需要给某个对象的功能进行功能增强的时候,可以考虑找一个代理进行增强。第一个作用:当一个对象需要受到保护的时候,可以考虑使用代理对象去完成某个行为。(如果你使用代理模式的话,对于客户端程序来说,客户端是无法察觉到的,客户端在。第三个作用:A对象无法和B对象直接进行交互式时,也可以使用代理模式来解决。第三个角色:目标对象和代理对象的公共接口。使用代理对象的时候就像在使用目标对象。在 java 程序中的代理模式的作用。第二个角色:代理对象(替身演员)第一个角色:目标对象(演员)

2024-01-05 12:51:10 1127 1

原创 Spring中通过注解给Bean的属性进行赋值

@ Resource 注解默认根据名称装配 byName ,未指定 name 时,使用属性名作为 name。.@ Autowired 注解默认根据类型装配 byType ,如果想根据名称装配,需要配合@ Qualifier 注解一起用。.@ Autowired 注解用在属性上、 setter 方法上、构造方法上、构造方法参数上。@Qualifier:@Qualifier和@Autowired联合实用可以根据名字进行装配。@Value:当属性的类型是简单类型时,可以实用@Value注解进行注入。

2024-01-04 22:28:42 399 1

原创 Spring中声明Bean的注解

以上四个注解中@Controller、@Service、@Repository这三个都是@Component注解的别名,为了提高程序的可读性。@Service注解用在业务层上,@Repository用在持久层上,@Controller用在表示层上。. 第二步:在配置文件中添加 context 命名空间。. 第四步:在 Bean 类上使用注解。. 第三步:在配置文件中指定扫描的包。. 第一步:加入 aop 的依赖。Spring 注解的使用。

2024-01-03 21:38:15 683 1

原创 Spring中,在singleton+setting模式下,为什么循环依赖不会出现问题,Spring是如何应对的。

第一个阶段:在 Spring 容器加载的时候,实例化 Bean ,只要其中任意一个 Bean 实例化之后,马上进行"曝光"【不等属性赋值就曝光】注意:只有scope是singleton的情况下,Bean才会采取提前“曝光”的措施。第二个阶段: Bean "曝光"之后,再进行属性的赋值(调用 set 方法。核心解决方案是:实例化对象和对象的属性赋值分为两个阶段来完成的。

2024-01-02 17:58:02 594 1

原创 Spring中Bean的生命周期

(添加的这三个点位的特点:都是在检查你这个 Bean 是否实现了某些特定的接口,如果实现了这些接口,则 Spring 容器会调用这个接口中的方法。*第三步:初始化 Bean (会调用 Bean 的 init 方法。)*第四步:使用 Bean。*第五步:销毁 Bean (会调用 Bean 的 destroy 方法。*第七步:销毁 Bean (会调用 Bean 的 destroy 方法。*第四步:初始化 Bean (会调用 Bean 的 init 方法。*第二步:给 Bean 属性赋值(调用 set 方法。

2023-12-29 10:54:59 718 1

原创 Spring中BeanFactory和FactoryBean的区别

BeanFactory是Spring loC 容器的顶级对象, BeanFactory 被翻译为" Bean 工厂",在 Spring 的 loC 容器中," Bean 工厂"负责创建 Bean 对象。.第二类:工厂 Bean (记住:工厂 Bean 也是一种 Bean ,只不过这种 Bean 比较特殊,它可以辅助 Spring 实例化其它 Bean 对象。FactoryBean :它是一个 Bean ,是一个能够辅助 Spring 实例化其它 Bean 对象的一个 Bean。.第一类:普通 Bean。

2023-12-28 15:58:29 338 1

原创 Spring中Bean的实例化方式

通过 factory - bean 属性+ factory - method 属性来共同完成,告诉 Spring 框架,调用哪个对象的哪个方法来获取 Bean。由于自己编写的类实现了 FactoryBean 接口,所以这个类是一个特殊的类,不需要你再手动指定: factory - bean 、 factory - method。Spring 提供的实例化方式,在 spring 配置文件中直接配置类全路径, Spring 会自动调用该类的无参数构造方法来实例化 Bean。. 第一种:通过构造方法实例化。

2023-12-28 15:51:58 341 1

原创 GoF之工厂模式

它有多个抽象产品类,每个抽象产品类可以派生出多个具体产品类,一个抽象工厂类,可以派生出多个具体工厂类,每个具体工厂类可以创建多个具体产品类的实例。而抽象工厂模式针对的是多个产品等级结果。.抽象工厂模式相对于工厂方法模式来说,就是工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂类,而抽象工厂模式是多个产品系列一个工厂类。当你扩展一个产品的时候,符合 OCP 原则,因为只需要添加两个类,一个类是具体产品类, 一个类是具体工厂类。

2023-12-28 12:21:25 340 1

原创 spring中Bean的作用域(scope)

如果在 Servlet 的 WEB 应用中使用 global session 的话,和 session 一个效果。. websocket :一个 websocket 生命周期对应一个 Bean。spring 上下文初始化的时候,并不会初始化这些 prototype 的 bean。. application :一个应用对应一个 Bean。. session :一个会话对应一个 Bean。每一次调用 getBean ()方法的时候,都返回那个单例的对象。. singleton :默认的,单例。

2023-12-28 10:57:02 380 1

原创 spring中命名空间注入

.第一:在 XML 头部信息中添加 p 命名空间的配置信息: xmlns : p ="http://www.springframework.org/schema/p".第一:需要在 xml 配置文件头部添加信息: xmlns : c ="http://www.springframework.org/schema/c".第二: p 命名空间注入是基于 setter 方法的,所以需要对应的属性提供 setter 方法。使用util命名空间的前提是: 在spring配置文件头部添加配置信息。

2023-12-27 22:23:29 319 1

原创 Spring 框架实现控制反转 IoC

控制反转的实现方式有多种,其中比较重要的叫做:依赖注入( Dependency Injection ,简称 DI )。依赖注入:对象 A 和对象 B 之间的关系,靠注入的手段来维护。而注入包括: set 注入和构造注入。第一件事:我不在程序中采用硬编码的方式来 new 对象了。第二件事:我不在程序中采用硬编码的方式来维护对象的关系了。注入:是一种手段,通过这种手段,可以让 A 对象和 B 对象产生关系。依赖: A 对象和 B 对象的关系。Spring 框架可以维护对象和对象之间的关系。

2023-12-25 17:56:36 760

原创 MyBatis 的缓存技术

什么时候一级缓存失效:第一次 DQL 和第二次 DQL 之间你做了以下两件事中的任意一件,都会让一级缓存清空:1.执行了 sqlSession 的 clearCache ()方法,这是手动清空缓存。mybatis 的缓存:将 select 语句的查询结果放到缓存(内存)当中,下一次还是这条 select 语句的话,直接从缓存中取,不再查数据库。什么时候不走缓存:SqlSession对象不是同一个,查询条件不一样,不走缓存。缓存的作用:通过减少 IO 的方式,来提高程序的执行效摔。一级缓存默认是开启的。

2023-12-25 11:26:59 391

原创 动态SQL 标签

.所有条件都为空时, where 标签保证不会生成 where 子句。· 比如我们只更新提交的不为空的字段,如果提交的数据是空或者"",那么这个字段我们将不更新。· 主要使用在 update 语句当中,用来生成 set 关键字,同时去掉最后多余的",". prefix :在 trim 标签中的语句前添加内容。. suffix :在 trim 标签中的语句后添加内容。. prefixOverrides :前缀覆盖掉(去掉)· suffixOverrides :后缀覆盖掉(去掉)

2023-12-24 15:45:05 427

原创 MyBatis查询语句中resultMap结果映射

.第三种方式:是否开启驼峰命名自动映射(配置 settings )查询结果的列名和 java 对象的属性名对应不上怎么办?.第二种方式:使用 resultMap 进行结果映射。.第一种方式: as 给列起别名。

2023-12-22 21:54:24 738

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除