首页 > 其他分享 >Spring---频率最高面试题1

Spring---频率最高面试题1

时间:2024-08-22 23:25:35浏览次数:12  
标签:容器 面试题 Spring Bean --- bean IOC 注入

01. Spring 框架的基本理解

          •关键字:核心思想IOC\AOP、作用(解耦、简化),简单描述框架组成

·          Spring 框架是一款轻量级的开发框架,核心思想是 IOC (控制反转) AOP (面向切面编程), 为Java 应用程序开发提供组件管理服,用于组件之间的解耦,以及简化第三方JavaEE中间件技术的使用( JMS 、任务调度、缓存、 ORM 框架),是一个基础架构型的开发框架;

            Spring 框架包括: IOC 容器、 Validation 数据校验、 AOP 面向切面编程、 Transactions 事务管理、 Spring JDBC 、 Spring MVC 框架、以及各类第三方 JavaEE 中间件技术集成;

02.Spring 框架由哪些模块组成?

         关键字:官方文档描述,由 7 个模块组成

          Spring Framework 根据官方文档的描述,主要包括以下常用 5 个模块:

        1.Core:核心模块

              包括:IoC Container (loc容器),Events (事件通知机制),Resources (资源加载机制),i18n (国际化),Validation (数据校验),Data Binding (数据绑定),Type Conversio n (类型转换),SpEL (Spring表达式),AOP (面向切面编程);

         2.Testing:测试模块

               包括: Mock Objects (测试模拟对象),TestContext Framework (测试框架),Spring MV C Test (用于测试 Spring MVC ),WebTestClient (用于测试 WebClient 、 Restful 、 Webflux等);

          3.Data Access:数据访问模块

                包括: Transactions (事务管理),DAO Support (统一的 Data Access Object DAO 模式封装),JDBC ( Spring 对于 JDBC 的操作封装),O/R Mapping ( Spring 对于对象关系映射框架的封装,例如 Hibernate 等框架)等;

          4. Web Servlet: 基于Servlet的Web应用开发

                 包括:Spring MVC ( Spring 基于 MVC 模式设计封装的 Web框架), WebSocket ( Sprin g 集成 WebSocket , WebSocket 是一个服务器与客户端双向通信的技术) 等;

          5. Integration:企业级系统集成模块(不同系统之间的交互集成)

                包括:Remoting ( Spring 用于在分布式系统中进行远程服务调用的通讯框架),JMS (Spring集成各类Java消息中间件、Java消息服务[ Java Message Service ],例如ActiveMQ等),Java Email (邮件发送),Tasks Scheduling (任务调度);

03. Spring IOC的理解

·          关键字: IOC 名词解释,作用是解耦,使用 IOC 容器管理项目组件之间的耦合关系

           IOC( Inversion of Control ,中文释义:控制反转 )是 Spring 框架的核心思想之一,主要用于解耦。 IOC 是指将创建对象的控制权转移给 Spring 框架进行管理。由 Spring 框架根据配置文件或注解等方式,创建 bean 对象并管理各个 bean 对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦

            控制:指的是对象创建(实例化、管理)的权力

           反转:控制权交给外部环境(Spring 框架、IoC容器)

04.Spring IOC 容器的理解

·        关键字: IOC 容器的作用、存储形式、初始化过程

·         IOC 通常被理解为 IOC Container 容器,IOC 容器其实就是一个 Map,key 是每个 bean 对 APESOURCB象的 ID, value 是 bean 对象本身。 IOC 容器负责创建 bean 对象并管理 bean的生命周期。

并且根据配置好配置文件或注解,管理 IOC 容器中的每个 bean,以及根据 bean 之间的依赖关

系,完成 bean 之间的注入。

         IOC 容器属于 Spring Core 模块,用来创建和管理 Bean,默认使用单例的方式将 bean 存储

在 DefaultListableBeanFactory 类的 beanDefinitionMap 中(一个 ConcurrentHashMap类

型的Map集合);

          IOC 容器使用 ConcurrentHashMap 集合存储了 BeanDefinition 对象,该对象封装了 Sprin

g 对一个 Bean 所有配置信息,包括:类名,属性,构造方法参数,依赖,是否延迟加载,是否是

单例等配置信息;

05.Spring DI的理解

           ·关键字:名词解释

            DI ( Dependecy Inject ,中文释义:依赖注入) 是对 IOC 概念的不同角度的描述,是指应用程序在运行时,每一个 bean 对象都依赖 IOC 容器注入当前 bean 对象所需要的另外一个 bean 对象。(例如在 MyBatis 整合 Spring 时, SqlSessionFactoryBean 依赖 IOC 容器注入一个 D ataSource 数据源 bean );

06.什么是Spring 的bean 

        简单来说,Bean 代表被 IoC 容器管理的对象。在Spring中,构成应用程序主干并由Spring IoC(控制反转)容器管理的对象称为Beans。Bean是一个由Spring IoC容器实例化、组装和管理的对象。

        我们通过配置文件或注解,告诉 IoC 容器帮助我们管理哪些对象。

<bean id="..." class="...">
    <constructor-arg value="..."/>
</bean>

 

 作用

* Bean是Spring应用程序的基础构建块,它们通过依赖注入相互连接,形成应用程序的骨架。
* Spring容器负责Bean的创建、配置、组装和销毁,从而简化了应用程序的复杂性和开发难度。
* 通过Bean,Spring实现了应用程序的解耦,提高了代码的可重用性和可测试性。

 

07.将一个类声明为Bean的注解有哪些?

        · @Component:定义通用Bean的注解,可标注任意类为 Bean 。如果一个 Bean 不知道属于哪个层,可以使用@Component 注解标注。

          • @Repository :定义数据访问层Bean的注解。

           • @Service :定义业务层Bean的注解。

          · @Controller :定义控制器Bean的注解。

08.@Component和@Bean的区别是什么?

        · @Component 注解作用于类,而@Bean 注解作用于方法。

        · @Component 通常是通过类路径扫描来实现自动扫描并完成装配 Bean 到 Spring IOC 容器中。· @Bean 注解通常用于注解某个方法,通过 @Bean 注解告诉了 Spring IOC 容器,该方法的返回值实例是一个 Bean.

09.@Autowired和@Resource的区别是什么?

        · @Autowired 是 Spring 提供的注解,@Resource 是 JDK 提供的注解。

        · @Autowired 默认的注入方式为 byType (按类型自动注入),@Resource 默认注入方式为 byN ame (按名称自动注入)。

10.Spring框架中的常见注入方式有几种?

        ·关键字:整体介绍三种注入方式、分别介绍每个注入方式的细节

        • Spring IOC 有三种注入方式:构造注入、Setter注入、属性注入;

                   构造注入:使用构造方法注入 bean ;

                    Setter注入:使用Setter方法注入 bean ;

                    属性注入:使用成员属性注入 bean,不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠 IOC 容器实现注入,不严谨;

11.Spring中常见的ApplicationContext实现类有哪些?·关键字:分别介绍每种实现类或子接口

          · ClassPathXmlApplicationContext :根据项目类路径 classpath 下的配置文件加载 bean ;· FileSystemXmlApplicationContext:根据当前磁盘的一个绝对系统文件路径下的配置文件加载 bean ;

          • AnnotationConfigApplicationContext : 根据读取到的注解加载 bean ;

· WebApplicationContext : Web 容器下按照配置文件加载 bean;

12.BeanFactory和ApplicationContext有什么区别?·关键字:两者之间的关系、区别与不同、Bean的创建加载方式

          ·两者之间的关系: BeanFactory 和 ApplicationContext 是 Spring 的两大核心接口,都可以当做 Spring 的容器;

         ·两者区别与不同:

           BeanFactory 是Spring 里面最底层的接口,是 IoC的核心,定义了 IoC的基本功能,包含

了各种 Bean的定义、加载、实例化,依赖注入和生命周期管理等行为;

           ApplicationContext 接口作为 BeanFactory 接口的子接口,包含 BeanFactory 所具备的功能外,还提供了其它框架功能:继承 MessageSource(支持国际化),资源文件访问、可以同时加载多个配置文件、可以通过监听器管理 bean 的生命周期;

           Bean的创建加载方式:

BeanFactroy 采用的是延迟加载形式来注入 Bean,只有在使用到某个 Bean 时,才对该 Bea n 进行加载实例化。这样不能提前发现一些存在的 Spring 的配置问题。如果 Bean 的某一个属性没有注入,BeanFacotry 加载后,直至第一次使用调用 getBean()方法才会抛出异常;ApplicationContext 是在容器启动时,一次性创建了所有的 Bean 。这样,在容器启动时,我们就可以发现 Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。 Applicat ionContext 启动后预载入所有的单实例 Bean,所以在运行的时候速度比较快,因为它们已经创建好了。相对于 BeanFactory ,ApplicationContext 唯一的不足是占用内存空间,当应用程序配置 Bean 较多时,程序启动较慢;

13.Spring框架的启动流程

          主要是指Spring容器从开始加载配置文件到创建并初始化所有Bean的过程。以下是Spring框架的基本启动流程:

         1. 初始化Spring容器:

             容器的启动从创建`ApplicationContext`实例开始。`ApplicationContext`是Spring中高级的IoC容器。

             通常使用`ClassPathXmlApplicationContext`或`AnnotationConfigApplicationContext`来加载配置。

         2. 加载配置文件:

             当`ApplicationContext`被创建时,Spring将加载配置信息。这些配置信息可以是XML文件、Java注解或Java配置类。

         3. Bean定义:

             Spring容器读取配置信息,并将这些信息转换为内部结构,如BeanDefinition对象。

             BeanDefinition包含了Bean的类名、属性、构造器参数以及其他元数据。

        4. Bean的注册:

            容器将这些BeanDefinition注册到BeanFactory中。

       5. Bean的创建:

            容器负责创建Bean实例。这一过程是通过反射或CGLIB动态代理来完成的。

            默认情况下,Spring在容器启动时会创建并配置所有单例模式的Bean。

       6. 依赖注入:

            一旦Bean实例化,Spring就会根据BeanDefinition中的信息进行依赖注入。

            这包括设置属性值和解决Bean之间的依赖关系。

       7. Bean的初始化:

           如果Bean实现了`InitializingBean`接口,Spring将调用`afterPropertiesSet()`方法。

           如果Bean有指定`init-method`,Spring也会调用相应的方法。

       8. 使用Bean:

            此时,Bean已经准备好,可以被应用程序使用。

      9. 关闭容器:

          当应用结束时,可以关闭ApplicationContext。

          在关闭的过程中,如果Bean实现了`DisposableBean`接口,Spring将调用`destroy()`方法。

          如果Bean有指定`destroy-method`,Spring也会调用相应的方法。

下面是Spring启动流程中涉及的一些关键类和接口:

           `ApplicationContext`: Spring容器的接口,负责初始化、配置和创建Bean。

           `BeanFactory`: Spring核心的IoC容器,负责管理Bean的实例化、配置和依赖注入。

           `BeanDefinition`: 封装了Bean的定义信息。

           `BeanPostProcessor`: 允许自定义修改新实例化Bean的扩展点。

            `InitializingBean`: 接口,定义了Bean初始化的方法。

            `DisposableBean`: 接口,定义了Bean销毁前的方法。

        Spring框架的启动流程可以根据具体的应用场景和配置有所不同,例如使用Spring Boot时,许多配置和启动步骤都是自动化的。

14.Spring 框架中的Bean的作用域 

        singleton:Spring 只会为该 bean 对象只会创建唯一实例, Spring 中的 bean 默认都是单例

       ·prototype:每次获取 bean ,Spring 会创建一个新的 bean 实例;

      ·request:每一次 HTTP 请求,Spring 会创建一个新的 bean 实例;

·      session:不同的HTTP 会话,Spring 会创建不同的 bean 实例;

通过XML方式设置bean的作用域 

<bean id="demoDaoBean" class="com.apesource.dao.DemoDAOImpl" scope="singleton"/>

通过注解方式设置bean的作用域          

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

public class DemoDAOImpl implements IDemoDAO{ }

15.Spring 框架中的Bean的线程安全

       ·对于 prototype 作用域的 Bean ,每次都创建一个新对象,也就是线程之间不存在Bean共享,因此不会有线程安全问题

·      对于 singleton 作用域的 Bean,所有的线程都共享一个单例状态的 Bean,存在资源竞争,因此是存在线程安全问题的

     解决办法:

         对于 singleton 作用域的单例 bean,它的线程安全问题,常见有两种解决办法:

                在 bean 中尽量避免定义可变的成员变量(用于保存数据的成员变量);

                在类中定义一个 ThreadLocal 成员变量,将需要可变的成员变量保存在 ThreadLocal中;

16.Spring 框架中的Bean生命周期

          Spring Bean 的生命周期总体分四个阶段:实例化=> 属性注入 => 初始化 => 销毁·

        Step1 实例化 Bean:根据配置文件中 Bean 的定义,利用 Java Reflection 反射技术创建 Bean 的实例

         Step2 注入对象依赖的属性值(或对象)

         Step3 处理各种Aware接口: Spring 会检测该 Bean 是否实现了 xxxAware 接口,通过 Aware 类型的接口,可以让Spring框架为当前 Bean注入相应的内容。

                    如果 Bean 实现 BeanNameAware 接口,会调用它实现的 setBeanName(String beanId)方法,注入 Bean 的名字;

                    如果 Bean 实现 BeanClassLoaderAware 接口,调用 setBeanClassLoader()方法,注入ClassLoader 对象的实例; 

                     如果 Bean 实现 BeanFactoryAware 接口,会调用它实现的 setBeanFactory()方法,注入的是 Spring 工厂;

                     如果 Bean 实现 ApplicationContextAware 接口,会调用 setApplicationContext()方法,注入 Spring 上下文;

        Step4 执行BeanPostProcessor前置处理:如果想对 Bean 进行一些自定义的前置处理,那么可以让 Bean 实现了 BeanPostProcessor 接口,将会在该阶段调用 postProcessBeforeInitializat ion(Object obj, String s)方法。

         Step5 执行InitializingBean初始化方法:如果 Bean 实现了 InitializingBean 接口,执行 afeterPropertiesSet()方法。

·        Step6 执行init-method自定义初始化方法: 如果 Bean 在 Spring 配置文件中配置了 init-met hod 属性,则会自动调用其配置的初始化方法。

           Step7 执行BeanPostProcessor后置处理: 如果这个 Bean 实现了BeanPostProcessor接口,将会调用 postProcessAfterInitialization(Object obj, String s)方法,由于这个方法是在 Bea n 初始化结束后调用;

                  以上几个步骤完成后, Bean 已经被正确创建,可以正常使用这个 Bean 了。

         Step8 执行DisposableBean销毁Bean:当 Bean 不再需要时,会经过清理阶段,如果 Bean 实现了DisposableBean 这个接口,会调用其实现的 destroy()方法执行销毁;

         Step9 执行destroy-method自定义销毁方法: 如果这个 Bean 的 Spring 配置中配置了 destroy -method 属性,会自动调用其配置的自定义销毁方法。

标签:容器,面试题,Spring,Bean,---,bean,IOC,注入
From: https://blog.csdn.net/2301_79500020/article/details/141405172

相关文章

  • Terraform - 初解Terraform - 厂商
    云厂商资源1.配置云厂商访问控制:人员访问权限、API访问权限、秘钥等2.配置云厂商对应的provider3.定义云厂商资源4.申请云厂商资源创建配置文件对所有资源的代码描述都需要定义配置文件中,用于Terraform加载和解析,建议分类创建结构化的配置文件,例如version.tf:required_pro......
  • Terraform - 初解Terraform - 命令
    调试terraformfmt格式化当前目录的tf文件内容格式,并列出已进行格式化的文件列表-diff选项,显示格式更改的差异-recursive选项,在所有子目录递归执行terraformvalidate验证配置的语法有效性,检查和定位错误出现的详细位置和原因-json选项,以json格式显示结果默认在当前目录......
  • Linux云计算 |【第二阶段】SECURITY-DAY4
    主要内容:Kali系统、扫描与抓包、Nginx安全加固、Linux基本防护补充:使用Curl命令查看网页头部信息和页面内容不加选项,默认查看网页的内容;[-I]选项:访问服务器页面时,显示HTTP的头部信息;[-i]选项:访问服务器页面时,显示HTTP的头部信息和网页内容;[-X]选项:指定请求服务......
  • Terraform - 初解Terraform - 安装
    开发环境配置Note:安装环境为windows系统64位笔记本电脑1.安装适用于Windows的Terraform:https://developer.hashicorp.com/terraform/install2.下载Terraform:https://releases.hashicorp.com/terraform/1.9.4/terraform_1.9.4_windows_amd64.zip3.从下载中,将可执行文件......
  • POLIR-Society-Organization-Management: 决策网络、组织管理、运营沟通的几条重要原
    组织的不同管理以及共和方式;世界观、决策、授权、制定和审批计划、网络、风险与资源管理、监督和控制。1.“不完美群众”集成长期“最优组织”:任何人都不是完美的,任何领导和管理者都比方讲有95%+的决策或认知是正确的。微积分的动态而且“长期”最优组织。开放、多元、包容......
  • 基于 Python 3.12.4 和 PySide 6 的 假用户操作系统【0-0】虚拟终端框架
    基本目标实现工作目录的切换;实现非退出命令下的无限循环;到目前为止还不能实现的功能动态导入py文件中的模块缺少组件定义虚拟进程类command.pyfromctypesimportwindllfromPySide6.QtWidgetsimportQWidgetfromsysimportexitassys_exitfromosimportpath......
  • Terraform - 初解Terraform - 简介
    前言云计算主要提供计算服务,例如服务器、存储、数据库、网络等等;对于云服务,通常只需使用多少支付多少,从而帮助降低运营成本,使基础设施更有效地运行,并能根据业务需求的变化调整对服务的使用。公有云:多租户面向个人或企业由第三方云服务商托管和运营。私有云:专供一个企业......
  • python 05-标准库:csv、json、sqlite3、datetime模块
    csv模块importcsv#data.csv不存在时,会现在当前目录下创建一个data.csv文件withopen("data.csv","w",encoding='utf-8')asfile:writer=csv.writer(file)writer.writerow(["trasanction_id","product_id","pric......
  • 爬虫案例1-爬取图片的三种方式之一:DrissionPage篇(3)
    @目录前言DrissionPage介绍实战共勉博客前言继requests篇和selenium篇,本文是爬取图片的最后一个案例,利用了python第三方库DrissionPage来自动化爬取图片。当然,爬取图片肯定不止这三种方法,还有基于python的scrapy框架,基于node.js的express框架以及基于Java的webmagic框架等等。D......
  • 代码随想录DAY22 - 回溯算法 - 08/21
    目录理论回顾什么是回溯法回溯法的效率回溯法解决的问题如何理解回溯组合题干思路和代码递归法递归优化:剪枝组合总和Ⅲ题干思路和代码递归法递归优化电话号码的字母组合题干思路和代码递归法理论回顾什么是回溯法回溯是一种类似枚举的搜索方法,回溯和......