2024年java面试(一)--spring篇


文章目录


1.什么是spring?

Spring可以做很多事情,它为企业级开发提供给了丰富的功能,但是这些功能的底层都依赖于它的两个核心特性,也就是控制反转(Inversion of Control,IOC)和面向切面编程(aspect-oriented programming,AOP)。

为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

①基于POJO的轻量级和最小侵入性编程;

②通过依赖注入和面向接口实现松耦合;

③基于切面和惯例进行声明式编程;

④通过切面和模板减少样板式代码。

2.反射原理以及使用场景

Java反射 :是指在运行状态中,对于任意一个类都能够知道这个类所有的属性和方法;并且都能够调用它的任意一个方法;
反射原理 :Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method;其中class代表的时类对 象,Constructor-类的构造器对象,Field-类的属性对象,Method-类的方法对象。通过这四个对象我们可以粗略的看到一个类的各个组成部分。 ​ 如何得到Class的实例:

1.类名.class(就是一份字节码)

2.Class.forName(String className);根据一个类的全限定名来构建Class对象

3.每一个对象多有getClass()方法:obj.getClass();返回对象的真实类型
使用场景
开发通用框架 - 反射最重要的用途就是开发各种通用框架。很多框架(比如 Spring)都是配置化的(比如通过 XML 文件配置 JavaBean、Filter 等),为了保证框架的通用性,需要根据配置文件运行时动态加载不同的对象或类,调用不同的方法。
动态代理 - 在切面编程(AOP)中,需要拦截特定的方法,通常,会选择动态代理方式。这时,就需要反射技术来实现了。

JDK:spring默认动态代理,需要实现接口

CGLIB:通过asm框架序列化字节流,可配置,性能差
自定义注解 - 注解本身仅仅是起到标记作用,它需要利用反射机制,根据注解标记去调用注解解释器,执行行为。
操作权限不够的类属性和方法

3.Spring框架的设计目标,设计理念,和核心是什么?

Spring设计目标 :Spring为开发者提供一个一站式轻量级应用开发平台;
Spring设计理念 :在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;Spring通过IoC容器实现对象耦合关系的管理, 并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦;
Spring框架的核心 :IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。

IoC让相互协作的组件保持松散的耦合,而AOP编程允许你把遍布于应用各层的功能分离出来形成可重用的功能组件。

4.Spring的优缺点是什么?

优点 ①. 方便解耦,简化开发

Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。

②. AOP编程的支持

Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。

③. 声明式事务的支持

只需要通过配置就可以完成对事务的管理,而无需手动编程。

④. 方便程序的测试

Spring对Junit4支持,可以通过注解方便的测试Spring程序。

⑤. 方便集成各种优秀框架

Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。

⑥. 降低JavaEE API的使用难度

Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
缺点 Spring明明一个很轻量级的框架,却给人感觉大而全 Spring依赖反射,反射影响性能 使用门槛升高,入门Spring需要较长时间。

5.Spring 框架中都用到了哪些设计模式?

工厂模式 :BeanFactory就是简单工厂模式的体现,用来创建对象的实例;
单例模式 :Bean默认为单例模式。
代理模式 :Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术;
模板方法 :用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。
观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被自动更新,如Spring中listener的实现--ApplicationListener。

相关推荐
杨充3 分钟前
13.观察者模式设计思想
java·redis·观察者模式
Lizhihao_6 分钟前
JAVA-队列
java·开发语言
喵叔哟15 分钟前
重构代码之移动字段
java·数据库·重构
喵叔哟15 分钟前
重构代码之取消临时字段
java·前端·重构
fa_lsyk17 分钟前
maven环境搭建
java·maven
Daniel 大东37 分钟前
idea 解决缓存损坏问题
java·缓存·intellij-idea
wind瑞43 分钟前
IntelliJ IDEA插件开发-代码补全插件入门开发
java·ide·intellij-idea
HappyAcmen43 分钟前
IDEA部署AI代写插件
java·人工智能·intellij-idea
马剑威(威哥爱编程)1 小时前
读写锁分离设计模式详解
java·设计模式·java-ee
鸽鸽程序猿1 小时前
【算法】【优选算法】前缀和(上)
java·算法·前缀和