个人学习方式
JVM内存结构
答:JVM的内存结构分为:
方法区:用于存储类信息、常量、静态变量、即时编译器(JIT)编译后的代码(保存在内存之中,所以说是解释与编译共存的)。方法区也被叫做元空间。
堆:存储对象实例;在堆中分新生代、老年代,新生代用于存储新创建的对象;老年代用于存储较长时间的存活对象。
虚拟机栈:当线程运行一个Java方法时都会创建一个栈帧,用于存储局部变量表,操作数栈,动态连接、方法出口等。
本地方法栈:用于执行本地方法;
程序计数器:记录线程执行的字节码指令地址;用于实现线程的恢复与分支控制。
什么是双亲委派
答:双亲委派属于类加载器的工作模式;当接收到类加载请求时;不是自己尝试加载这个类,而是将加载请求传递给它的父加载器。如果父加载器还存在父加载器,则继续向上委托,直到到达最顶层的启动类加载器(Bootstrap ClassLoader)。只有当父加载器无法完成类加载时,当前加载器才会尝试加载该类。
优点:1. 防止重复加载;2.保证核心类库的安全性;3.保证程序的稳定和安全性。
Spring的自动装配
-
Spring的自动装配是什么?
spring中提供了向Bean中自动注入依赖的功能,这个过程就是自动装配,当向bean中注入的内容非常多的时候,自动注入依赖的功能将极大的节省注入程序的时间。 - Spring自动装配有两类:
基于xml文件的自动装配:byType(类型),byName(名称), constructor(根据构造函数)
基于注解的自动装配:@Autowired,@Resource,@Value
Spring的ioc是怎么实现的
是通过一个称为ApplicationContext的容器来实现的。在Spring中,容器负责创建和管理对象(即bean),并将这些对象之间的依赖关系进行解耦。以下是Spring IoC实现的基本步骤:
- 配置元数据:首先,需要告诉Spring容器如何创建和装配bean。这通常是在XML配置文件或者Java配置类中完成的,也可以使用注解的方式来声明bean。
- 读取配置元数据:当应用程序启动时,Spring容器会读取配置元数据,并根据其中的信息来创建和初始化bean。
- 创建BeanFactory:Spring的核心接口之一是
BeanFactory
,它是一个工厂,可以用来获取、创建和管理bean。Spring容器就是基于BeanFactory
的实现。 - 实例化bean:对于每个需要创建的bean,Spring容器都会调用对应的构造函数或静态工厂方法来实例化该bean。
- 处理依赖关系:一旦所有bean都被实例化,Spring容器就会开始解析它们之间的依赖关系。这是通过反射机制来实现的,Spring会检查每个bean的属性、构造函数参数或setter方法,如果发现它们被标记为自动装配,那么Spring会尝试找到一个匹配的bean并注入到目标位置。
- 注册生命周期回调:Spring还支持定义bean的生命周期回调方法,如初始化方法和销毁方法。在bean的生命周期的不同阶段,Spring会调用这些方法来执行相应的操作。
- 提供bean给客户端代码:最后,客户端代码可以通过从容器中请求特定的bean来获得并使用它们。由于所有的依赖关系都已经由Spring容器处理好了,客户端代码无需知道具体的实现细节。
AOP是怎么实现的
它允许开发者将横切关注点(如日志、事务管理、安全检查等)与业务逻辑分离,从而实现代码的模块化和复用。Spring框架提供了对AOP的支持,以下简要介绍Spring AOP的基本实现原理:
- 代理模式:Spring AOP主要通过代理模式来实现。当一个对象需要被增强时,Spring会为该对象创建一个代理对象,所有的方法调用都会通过这个代理对象来进行。
- 两种代理方式:
- JDK动态代理:如果目标类实现了接口,Spring会选择使用JDK的动态代理机制来创建代理对象。
- CGLIB代理:如果目标类没有实现任何接口,Spring会选择使用CGLIB库来创建代理对象。CGLIB通过字节码技术在运行时生成一个新的子类来作为代理。
- 织入(Weaving):这是指将切面(Aspect)应用到目标对象的过程。在Spring中,织入是在运行时完成的,这被称为“运行时织入”。
- 通知(Advice):通知是切面的具体实现,它定义了在某个特定连接点(Join Point)上执行的操作。常见的通知类型包括前置通知(Before)、后置通知(After Returning)、异常通知(After Throwing)和环绕通知(Around)。
- 切点(Pointcut):切点是一个或多个连接点的集合,定义了哪些方法会被通知所影响。通常通过表达式语言(如AspectJ的切点表达式)来描述切点。
- 配置:在Spring中,可以通过XML或者注解的方式来声明切面、切点和通知。Spring容器负责解析这些配置信息,并在运行时进行织入操作。
你学习过的设计模式有哪些
单例模式、工厂模式、建造者模式、代理模式、适配器模式、装饰器模式
- 单例模式(Singleton Pattern):
- 目的:确保一个类只有一个实例,并提供全局访问点。
- 实现:通过将构造函数设为私有,并提供一个静态方法来获取唯一的实例。
- 工厂模式(Factory Pattern):
- 目的:提供一个创建对象的接口,让子类决定实例化哪一个类。
- 类型:简单工厂、工厂方法、抽象工厂。
- 实现:定义一个接口,由该接口负责创建具体的产品对象。
- 建造者模式(Builder Pattern):
- 目的:将复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。
- 实现:定义一个 Builder 接口,由各个具体的 Builder 子类实现不同产品的构建过程。
- 代理模式(Proxy Pattern):
- 目的:为其他对象提供一种代理以控制对这个对象的访问。
- 实现:创建一个代理类,它包含一个指向真实对象的引用,并在需要时调用真实对象的方法。
- 适配器模式(Adapter Pattern):
- 目的:将一个类的接口转换成客户希望的另一个接口。适配器让原本不兼容的类能够一起工作。
- 实现:创建一个新的 Adapter 类,它包装了原始类并提供了新的接口。
- 装饰器模式(Decorator Pattern):
- 目的:动态地给一个对象添加一些额外的职责。就扩展功能而言,装饰器模式比生成子类更加灵活。
- 实现:定义一个装饰器类,它包含一个指向被装饰对象的引用,并实现了与被装饰对象相同的接口。
面向对象的特征
答:封装、继承、多态
-
多态:
- 多态是指同一个消息被不同的对象响应时产生不同的结果。它可以有多种表现形式,如重写(Override)、重载(Overload)等。
-
封装:
- 封装是指将数据(属性)和操作数据的方法(函数或方法)捆绑在一起,并对外提供一个公共接口。这样可以隐藏实现细节,只暴露必要的功能给外部调用。
-
继承:
- 继承允许定义一个新的类,该类拥有父类的属性和方法,并且可以添加自己的属性和方法。这提高了代码的复用性并减少了冗余。
线程和进程的区别
StringBuilder和StringBuffer的区别
MySQL有大量数据时如何优化
MySQL的回调是什么
为什么索引可以提高查询效率
Redis如何实现持久化存储
有序数列如何查询一个元素的位置
实现一个算法,快速找出所有的水仙花数
Was this helpful?
0 / 0