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。

相关推荐
weitingfu1 分钟前
Excel VBA 入门到精通(二):变量、数据类型与运算符
java·大数据·开发语言·学习·microsoft·excel·vba
某人辛木15 分钟前
Maven一步到位
java·maven
一条咸鱼_SaltyFish24 分钟前
DDD 架构重构实践:AI Skills 如何赋能DDD设计与重构
java·人工智能·ai·重构·架构·ddd·领域驱动设计
想唱rap26 分钟前
线程之条件变量和生产消费模型
java·服务器·开发语言·数据库·mysql·ubuntu
花千树-01032 分钟前
Java AI + TTS:让大模型开口说话
java·人工智能·ai·chatgpt·langchain·aigc·ai编程
Boop_wu42 分钟前
[Java 算法] 栈
java·开发语言·算法
不爱吃炸鸡柳43 分钟前
C++ STL 核心:string 从入门到精通(面试+源码+OJ实战)
java·c++·面试
廋到被风吹走1 小时前
【AI】Codex + 后端框架实战:Spring/Express/Django 业务逻辑全自动生成
人工智能·spring·express
程序员榴莲1 小时前
Java(十二)抽象类
java·开发语言
超级大只老咪1 小时前
线性递推通用模板
java·开发语言·算法