spring常见面试题 | 面试题谈谈你对spring的理解

本文深入探讨Spring框架的起源、核心理念与优势,包括控制反转、面向切面编程、bean作用域及配置方式,揭示Spring如何提升Java开发效率与项目维护性。


一、spring为什么出现?

spring的出现是为了解耦,我们在学习java初期,相信很多小伙伴都使用的是 JSP+Servlet+MySQL+JDBC 技术,在操作 dao层 的时候,每次都需要实例化一次,这样是不是就很繁琐;有的人可能使用单例模式来解决这个问题,但业务代码与单例模式的模板代码放在一个类里而且也会出现大量重复的单例模式的模板代码,耦合性较高,要知道java语言可是高内聚,低耦合的;所以伟大的 Spring 就出现了,也就是类似于数据库连接池的东西。下面着重介绍这个框架。

二、理解Spring

传统Java SE程序设计,我们直接在对象内部通过new进行创建对象或者getInstance等直接或者间接调用构造方法创建一个对象;而在Spring开发模式中,Spring容器使用了工厂模式为我们创建了所需要的对象(这个过程就是DI通过setter方法在配置中注入对象),我们使用时不需要自己去创建,直接调用Spring为我们提供的对象即可,这就是控制反转的思想。实例化一个java对象有三种方式:

  1. 使用类构造器,
  2. 使用静态工厂方法
  3. 使用实例工厂方法

当使用spring时我们就不需要关心通过何种方式实例化一个对象,spring通过控制反转机制自动为我们实例化一个对象。

三、面向切面AOP

在面向对象编程(OOP)思想中,我们将事物纵向抽象成一个个的对象。而在面向切面编程中,我们将一个个对象某些类似的方面横向抽象成一个切面,对这个切面进行一些如权限验证,事物管理,记录日志等公用操作处理的过程就是面向切面编程的思想。

四、Spring支持的几种bean的作用域。

Spring框架支持以下五种bean的作用域:

  1. singleton : bean在每个Spring ioc 容器中只有一个实例。
  2. prototype:一个bean的定义可以有多个实例。
  3. request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  4. session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  5. global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效

五、使用Spring框架的好处是什么

轻量:Spring是 轻量 的,基本的版本大约2MB。 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。 面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。 容器:Spring 包含并管理应用中对象的生命周期和配置。 MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

六、Spring配置bean实例化有哪些方式。

1)使用类构造器实例化(默认无参数)

  <bean id="bean1" class="cn.itcast.spring.b_instance.Bean1"></bean>  

2)使用静态工厂方法实例化(简单工厂模式)
下面这段配置的含义:调用Bean2Factory的getBean2方法得到bean2

 <bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2"></bean>  

3)使用实例工厂方法实例化(工厂方法模式)

先创建工厂实例bean3Facory,再通过工厂实例创建目标bean实例

<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory"></bean>
 <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean> 
### 基础概念类 - **谈谈Spring Boot的理解**:Spring Boot是简化Spring应用开发的框架,它通过自动配置、起步依赖等特性,让开发者可以快速搭建独立的、生产级别的Spring应用,减少了繁琐的配置工作,提高开发效率[^3]。 - **Spring Boot需要独立容器进行运行吗**:Spring Boot应用可以内嵌Tomcat、Jetty等Servlet容器,因此通不需要独立的Servlet容器就能运行,当然也可以将其打包成war包部署到独立容器中[^1]。 ### 自动装配类 - **Spring Boot自动装配的原理**:Spring Boot的自动装配是基于`@EnableAutoConfiguration`注解,该注解会触发Spring Boot去扫描`META - INF/spring.factories`文件,该文件中配置了一系列的自动配置类。Spring Boot会根据类路径下的依赖、配置属性等条件,选择性地启用这些自动配置类,将相应的Bean注册到Spring容器中[^1]。 - **如何理解Spring Boot中的Starters**:Starters是一系列依赖的集合,它将相关的依赖打包在一起。使用Starters可以简化依赖管理,开发者只需要引入对应的Starter,就可以获得相关功能所需的所有依赖。例如,`spring-boot-starter-web`包含了构建Web应用所需的Spring MVC、Tomcat等依赖[^4]。 ### 注解类 - **Spring Boot用注解有哪些及应用场景**: - `@SpringBootApplication`:通标注在主类上,是`@SpringBootConfiguration`、`@EnableAutoConfiguration`和`@ComponentScan`的组合注解,用于开启Spring Boot的自动配置、组件扫描等功能[^4]。 - `@RestController`:是`@Controller`和`@ResponseBody`的组合注解,用于创建RESTful风格的控制器,将方法的返回值直接作为响应体返回。 - `@RequestMapping`:用于映射HTTP求到控制器的处理方法,可以指定求的路径、求方法等。 - `@Autowired`:用于自动注入依赖的Bean,支持按类型注入。 ### 配置文件类 - **Spring Boot的配置文件有哪几种格式,它们有什么区别**:Spring Boot支持`properties`和`yaml`两种配置文件格式。`properties`格式是键值对的形式,语法简单,但层级关系不够清晰;`yaml`格式使用缩进表示层级关系,结构更清晰,可读性更好,并且支持数组、对象等复杂数据结构[^5]。 - **bootstrap配置文件的应用场景**:使用Spring Cloud Config配置中心时,需要在`bootstrap`配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;还适用于设置一些固定的不能被覆盖的属性,以及一些加密/解密的场景[^5]。 ### 与其他框架结合类 - **Spring Boot和Spring Cloud的联系**:Spring Boot是构建单个微服务的基础框架,而Spring Cloud是一套用于构建分布式系统的工具集,它基于Spring Boot构建。Spring Boot可以帮助快速搭建微服务,而Spring Cloud提供了服务发现、配置管理、负载均衡等分布式系统所需的功能,二者结合可以方便地构建复杂的微服务架构[^1]。 ### 代码示例 以下是一个简单的Spring Boot应用示例: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @SpringBootApplication @RestController public class DemoApplication { @GetMapping("/hello") public String hello() { return "Hello, Spring Boot!"; } public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

T-OPEN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值