JAVA 小知识

1、讲一下进程切换

进程切换(Process Context Switch)是指操作系统将CPU从当前正在运行的进程中暂停,并将另一个就绪进程放入内存并恢复其执行状态的过程。下面是进程切换的过程:

(1)决定是否作上下文切换以及是否允许作上下文切换。包括对进程调度原因的检查分析,以及当前执行进程的资格和CPU执行方式的检查等。在操作系统中,上下文切换程序并不是每时每刻都在检查和分析是否可作上下文切换,它们设置有适当的时机。
(2)保存当前执行进程的上下文。这里所说的当前执行进程,实际上是指调用上下文切换程序之前的执行进程。如果上下文切换不是被那个当前执行进程所调用,且不属于该进程,则所保存的上下文应是先前执行进程的上下文,或称为“老”进程上下文。显然,上下文切换程序不能破坏“老”进程的上下文结构。
(3)使用进程调度算法,选择一处于就绪状态的进程。
(4)恢复或装配所选进程的上下文,将CPU控制权交到所选进程手中。

2、Spring IOC

IOC-Inversion of Control,即控制反转,一种设计思想。

传统的创建对象的方法是直接通过 new 关键字,而 spring 则是通过 IOC 容器来创建对象,也就是说我们将创建对象的控制权交给了 IOC 容器。我们可以用一句话来概括 IOC:

IOC 让程序员不在关注怎么去创建对象,而是关注与对象创建之后的操作,把对象的创建、初始化、销毁等工作交给spring容器来做。

3、依赖注入

Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入。

4、Spring AOP

AOP(Aspect-Oriented Programming)是一种编程范式,旨在通过将横切关注点从主逻辑中分离出来,提高模块化程度。相比于 OOP(Object-Oriented Programming),OOP 的模块化单位是类,而 AOP 的模块化单位是切面(aspect)。切面指的是与某个类(或者对象)的多个方法都有关联的横切关注点,例如日志记录、性能监控、权限控制等。通过 AOP,我们可以将这些横切关注点统一管理起来,并在需要时动态地将它们织入到业务逻辑中。

Spring AOP 是 Spring 框架中的一个重要功能,在 Spring 应用程序中广泛使用。Spring AOP 基于代理模式实现,并且支持两种类型的代理:基于接口的代理(JDK 动态代理)和基于子类的代理(CGLIB)。与传统的代理模式相比,Spring AOP 更加灵活,支持在不修改目标类源码的情况下进行代理,避免了代码耦合性和可维护性的问题。

Spring AOP 主要包含以下三个核心组件:

(1)切点(Pointcut):用于定义在哪些类或方法上应用通知。切点通过一个表达式来描述对哪些类或方法进行拦截,例如可以使用表达式 “execution (* com.example.service…(…))” 来表示拦截 com.example.service 包下所有类的所有方法。

(2)通知(Advice):指的是切面中的具体操作,例如在方法执行前、执行后或者抛出异常时记录日志等。Spring AOP 支持五种通知类型:前置通知(Before)、后置通知(AfterReturning)、异常通知(AfterThrowing)、最终通知(After)、环绕通知(Around)。

(3)切面(Aspect):指的是通知和切点的结合体,用于定义一组通知和切点的组合。

需要注意的是,Spring AOP 只能拦截方法调用,而无法拦截访问类属性等操作。如果需要实现更加细粒度的拦截,可以考虑使用 AspectJ 等 AOP 框架。同时,由于 Spring AOP 是基于代理模式实现的,因此目标类中的同类方法调用并不会被拦截,需要开发人员自行处理这种情况。

5、Bean 生命周期

Bean生命周期指的是容器在创建Bean实例时所执行的一系列操作,包括Bean的实例化、属性赋值、初始化、销毁等过程。具体而言,Bean生命周期可以分为以下几个阶段:

(1)实例化阶段:容器根据Bean定义创建一个新的Bean实例对象。

(2)属性赋值阶段:容器将配置文件中声明的属性值和对其他Bean的引用赋值给新创建的Bean实例。

(3)初始化阶段:该阶段可以分为两部分:

初始化回调方法(afterPropertiesSet()或自定义方法):在所有属性都被设置后,容器会调用初始化回调方法来执行一些初始化操作。

Aware回调方法(set…()方法):如果Bean实现了Aware接口,在所有属性被设置后,容器会调用相应的set…()方法。

(4)使用阶段:Bean实例可以被其他Bean或者容器本身使用。

(5)销毁阶段:容器在关闭时会调用Bean实例的销毁方法来释放资源。

需要注意的是,Spring容器对于singleton Bean和prototype Bean的生命周期处理是不同的。对于singleton Bean,容器只会在第一次创建时执行实例化、属性赋值和初始化操作,并且该Bean实例会一直存在于容器中,直到容器关闭;而对于prototype Bean,容器每次从Bean工厂中获取Bean实例时,都会执行一遍实例化、属性赋值和初始化操作,容器不会对该Bean实例进行管理。因此,prototype Bean的使用较为灵活,但也需要开发人员自己负责Bean的销毁。

6、动态代理和静态代理

动态代理和静态代理是代理模式的两种不同实现方式。它们之间的主要区别在于代理类的生成时机和方式不同

静态代理需要程序员手动编写代理类,即在编译期就已经确定代理类和委托类的关系。在使用静态代理时,每新增一个委托类或接口,都需要编写一个对应的代理类,这样会导致代理类数量增多,且开发工作量大。

动态代理则是在运行期通过反射机制动态生成代理类**,代理类的类型是在运行时确定的,不需要在编译期确定**。因此,动态代理能够更加灵活地创建代理对象,同时避免了静态代理的代码冗余问题。

在 Java 中,动态代理主要由 JDK 动态代理和 CGLIB 来实现。JDK 动态代理只能对实现了接口的类进行代理,而 CGLIB 可以对任何类进行代理。通常情况下,使用 JDK 动态代理实现 AOP 是最为合适的选择,因为 JDK 动态代理比 CGLIB 更稳定,性能也更好。

7、Java 反射机制

反射机制指的是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
本质上,反射机制是在 JVM 得到 class 对象之后,再通过 class 对象进行反编译,从而获取对象的各种信息。

8、SpringBoot 的 好处

Spring Boot 是一个基于 Spring 框架的快速开发框架,其主要好处如下:

(1)快速搭建 Spring 项目:Spring Boot 提供了一些自动配置和模板的功能,使得开发者可以轻松搭建一个 Spring 项目。使用 Spring Boot 可以大大减少应用程序的启动时间和开发工作量。

(2)简化配置:Spring Boot 提供了一些默认的配置,可以避免开发者进行繁琐的配置工作。同时,Spring Boot 还提供了一个配置文件 application.properties 或 application.yml,可以方便地对应用程序进行配置。

(3)集成多种技术:Spring Boot 集成了多种技术,如 Spring Data、Spring Security、Thymeleaf 等,使得开发者可以更加方便地使用这些技术来开发应用程序。

(4)易于部署和维护:Spring Boot 配合使用 Maven 或 Gradle,可以方便地进行项目打包,将项目部署到服务器上。同时,Spring Boot 还提供了一些监控和诊断功能,可以帮助开发者进行项目维护和故障排查等工作。

总之,Spring Boot 通过自动配置、简化配置、集成多种技术等方式,大大简化了 Spring 开发流程,提升了开发效率和应用程序的性能。

9、如何解决SpringBoot 循环依赖问题

  1. 构造器的循环依赖:这种依赖spring是处理不了的,直接抛出BeanCurrentlylnCreationException
    异常。
  2. 单例模式下的setter循环依赖:通过“三级缓存”处理循环依赖。
  3. 非单例循环依赖:无法处理。

10、SpringBoot 三级缓存

第一级缓存:也叫单例池,存放已经经历了完整生命周期的Bean对象。

第二级缓存:存放早期暴露出来的Bean对象,实例化以后,就把对象放到这个Map中。(Bean可能只经过实例化,属性还未填充)。

第三级缓存:存放早期暴露的Bean的工厂。

11、同步阻塞IO、同步非阻塞IO、IO 多路复用

在计算机网络中,IO模型指的是应用程序进行IO操作时所采用的方式。常见的IO模型包括同步阻塞IO、同步非阻塞IO和多路复用IO。

(1)同步阻塞IO(Synchronous Blocking IO):服务端采用单线程,当 接收 一个请求后, 调用阻塞时,将无法 接受 其他请求(必须等上一个请求 recv 或 send 完),无法处理并发。

(2)同步非阻塞IO(Synchronous Non-blocking IO):服务器端当 accept 一个请求后,加入 fds 集合,每次轮询一遍 fds 集合 recv(非阻塞)数据,没有数据则立即返回错误,每次轮询所有 fd(包括没有发生读写事件的fd)会很浪费 cpu。

(3)多路复用IO(Multiplexing IO):服务器端采用单线程通过 select/epoll 等系统调用获取 fd 列表,遍历有事件的 fd 进行 accept/recv/send,使其能支持更多的并发连接请求。
在这里插入图片描述
1.select(轮询),当客户端发生io事件时,将fd_set文件描述符列表传入内核中,为数组实现大小为1024,进程无法知道是那个客户端,需要进程进行轮询,时间复杂度为O(n)
2.poll,和select差不多,不过底层采用链表实现,所以无大小限制。
3.epoll,避免了轮询,底层使用红黑树和链表实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值