【Java面试题】框架篇——Spring

news2024/11/20 20:31:25

文章目录

  • 什么是Spring框架?Spring框架有哪些主要模块?
  • Spring有几种配置方式?
  • Spring框架中的单例Beans是线程安全的么?
  • Spring 框架中都用到了哪些设计模式?★★★
  • Spring AOP在实际项目中的应用★★★
  • 阐述一下Bean的生命周期?
  • Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?
  • SpringData有了解么吗?
  • Spring的IOC你了解哪些?★★★
  • @Resource 和 @Autowired 的区别
  • Spring的AOP你了解哪些?★★★

什么是Spring框架?Spring框架有哪些主要模块?

​ Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。Spring帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。Spring框架本身亦是按照设计模式精心打造,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。

Spring框架至今已集成了20多个模块。这些模块主要被分如下图所示的核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

在这里插入图片描述

Spring有几种配置方式?

将Spring配置到应用开发中有以下三种方式:

  • 基于XML的配置
  • 基于注解的配置
  • 基于Java的配置

Spring框架中的单例Beans是线程安全的么?

​ Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Servie类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。

​ 最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

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

Spring框架中使用到了大量的设计模式,下面列举了比较有代表性的:

  • 代理模式—在AOP和remoting中被用的比较多。

  • 单例模式—在spring配置文件中定义的bean默认为单例模式。

  • 模板方法—用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。

  • 工厂模式—BeanFactory用来创建对象的实例。

Spring AOP在实际项目中的应用★★★

权限管理、表单验证、事务管理、信息过滤、拦截器、过滤器、页面转发等等。

阐述一下Bean的生命周期?

在Spring框架中,Bean的生命周期通常包括以下几个阶段:

1. 实例化Bean对象:当Spring容器需要一个Bean时,会调用Bean类的构造方法创建一个新的Bean实例。

2. Bean属性赋值:Spring容器会在创建Bean实例后,将Bean类中的属性值赋给实例变量。

3. Bean初始化:Spring容器会在Bean实例化后,调用@PostConstruct注解标注的方法对Bean进行初始化操作。这个方法可以有多个,并且是按照声明顺序执行的。

4. Bean使用:Spring容器会在需要使用Bean的时候,调用getBean方法获取Bean实例。此时,Bean已经被创建并初始化完毕,可以直接使用了。

5. Bean销毁:当Spring容器不再需要Bean时,会调用destroy方法销毁Bean实例。在销毁之前,Spring容器会先调用deallocate方法释放Bean占用的资源。如果在Bean中使用了ThreadLocal等线程本地变量,则会在线程结束时自动清理。

下面是一个简单的示例,展示了Spring中Bean的生命周期:

public class MyBean {
    private int count;

    public MyBean(int count) {
        this.count = count;
    }

    @PostConstruct
    public void init() {
        System.out.println("Initializing MyBean, count=" + count);
    }

    public void doSomething() {
        System.out.println("Doing something with MyBean, count=" + count);
    }
}

@Configuration
public class AppConfig {
    @Bean
    public MyBean myBean(int count) {
        return new MyBean(count);
    }
}

public class App {
    public static void main(String[] args) throws Exception {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyBean bean = (MyBean) context.getBean("myBean");
        bean.init(); // Initializing MyBean, count=0
        bean.doSomething(); // Doing something with MyBean, count=0
        context.close(); // 关闭应用程序上下文,销毁所有bean实例和资源
    }
}

// applicationContext.xml文件内容如下:
<bean id="myBean" class="com.example.MyBean">
    <property name="count">0</property>
</bean>


Spring 中有哪些方式可以把 Bean 注入到 IOC 容器?

在Spring中,有以下几种方式可以把Bean注入到IOC容器:

1. 构造函数注入:通过在Bean类的构造函数上使用@Autowired注解,将需要注入的Bean作为参数传递给构造函数。

2. Setter方法注入:通过在setter方法上使用@Autowired注解,将需要注入的Bean作为参数传递给setter方法。

3. 字段注入:通过在Bean类的属性上使用@Autowired注解,将需要注入的Bean作为属性值直接赋值。

4. @Resource注解:使用@Resource注解标注一个静态方法或类,该方法或类会自动装配一个指定类型的Bean实例。

5. @ComponentScan注解:使用@ComponentScan注解扫描指定包下的所有类,并将被扫描到的类自动装配到IOC容器中。

6. @Import注解:使用@Import注解导入其他配置文件中定义的Bean,这些Bean会被自动装配到IOC容器中。

7. @Qualifier注解:使用@Qualifier注解指定需要装配的具体Bean的名称,以便在多个相同类型的Bean之间进行选择。

SpringData有了解么吗?

1. Spring Data JPA Repositories:提供了一些高级功能,如查询构造器、分页、排序等,使得开发人员可以更加方便地进行JPA数据访问。

2. Spring Data REST Repositories:提供了一些高级功能,如RESTful风格的接口、JSON序列化和反序列化等,使得开发人员可以更加方便地进行RESTful数据访问。

3. Spring Data Elasticsearch Repositories:提供了一些高级功能,如支持Elasticsearch的索引和搜索、集成Elasticsearch模板等,使得开发人员可以更加方便地进行Elasticsearch数据访问。

4. Spring Data MongoDB:提供了一些高级功能,如支持MongoDB的索引和搜索、集成MongoDB模板等,使得开发人员可以更加方便地进行MongoDB数据访问。

总之,Spring Data提供了多种数据访问技术的支持,可以根据不同的需求选择合适的技术进行数据访问。同时,Spring Data还提供了很多高级功能和扩展性,可以帮助开发人员更加方便地进行数据访问和管理。

Spring的IOC你了解哪些?★★★

Spring IoC (Inversion of Control) 是一种依赖注入(Dependency Injection,DI)的实现方式,它可以解决 Java 应用程序中组件之间的耦合问题。

在 Spring IoC 中,组件不再直接依赖于其他组件,而是通过容器(IoC Container)来管理它们的依赖关系。当需要使用一个组件时,容器会自动将该组件注入到调用它的代码中,从而实现了解耦和松散耦合。

Spring IoC 主要由以下几个部分组成:

  1. 容器(IoC Container):负责管理应用程序中的所有组件,并将它们组合在一起以创建完整的应用程序。Spring IoC 默认使用的是 Tomcat 作为 IoC Container。
  2. 配置文件(Configuration File):用于定义应用程序中所有组件的依赖关系。Spring IoC 通过 XML 或 Java 配置文件来实现配置。
  3. 注解(Annotation):用于描述组件之间的依赖关系。Spring IoC 支持多种注解,如 @Autowired、@Inject 等。
  4. 代理(Proxy):Spring IoC 在运行时动态地创建一个代理对象,用于管理组件之间的依赖关系。代理对象可以拦截方法调用,并在调用前或调用后执行一些额外的操作。

总之,Spring IoC 可以大大简化 Java 应用程序的开发过程,提高代码的可维护性和可测试性。

@Resource 和 @Autowired 的区别

@Resource@Autowired 都是Spring框架中用于自动装配Bean的注解,它们的作用是一样的,都是将一个或多个Bean注入到目标对象中。

不过,它们之间还是有一些区别的:

1. `@Resource` 是Java EE标准中的注解,而`@Autowired` 是Spring框架中的注解。因此,如果你使用的是Java EE标准规范,那么你可以使用`@Resource`注解;如果你使用的是Spring框架,那么你可以使用`@Autowired`注解。

2. `@Resource`注解可以同时指定多个Bean进行注入,而`@Autowired`注解只能指定一个Bean进行注入。例如:
@Resource
private UserService userService;

@Autowired
private UserService userService; // 只指定了一个UserService Bean
3. `@Resource`注解可以指定Bean的名称,而`@Autowired`注解不能直接指定Bean的名称。如果需要指定Bean的名称,可以通过`@Qualifier`注解来指定。例如:
@Resource(name="userService")
private UserService userService;

@Autowired
@Qualifier("userService")
private UserService userService; // 通过@Qualifier指定了bean的名称为"userService"


总之,@Resource@Autowired注解的主要区别在于它们的来源和使用方式。如果你使用的是Java EE标准规范,那么你可以使用@Resource注解;如果你使用的是Spring框架,那么你可以使用@Autowired注解。无论使用哪种注解,都需要根据实际情况选择合适的方式进行Bean的注入。

Spring的AOP你了解哪些?★★★

Spring AOP (Aspect-Oriented Programming) 是一种面向切面编程(Aspect-Oriented Programming,AOP)的实现方式,它可以解决 Java 应用程序中横切关注点(Cross-Cutting Concerns)的问题。

在 Spring AOP 中,我们可以将横切关注点从业务逻辑代码中分离出来,通过定义切面(Aspect)来统一处理。切面是一个包含一系列通知(Advice)的模块化单元,通知可以在程序执行的不同阶段执行,如方法调用前、方法调用后、异常处理等。

Spring AOP 主要由以下几个部分组成:

1. 切面(Aspect):定义一个或多个通知,用于描述横切关注点的处理逻辑。

2. 实现接口(Interface):定义切面接口,并实现其中的方法。

3. 织入(Weaving):将切面应用到目标对象中,使其具有横切关注点的处理能力。Spring AOP 支持两种织入方式,即基于代理的织入和基于 CGLIB 的织入。

4. AOP 配置文件(Aspect Configuration File):用于定义切面的声明和切点表达式等信息。Spring AOP 通过 XML 或注解方式来实现配置。

总之,Spring AOP 可以大大简化 Java 应用程序的开发过程,提高代码的可维护性和可测试性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/693925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Transformers 为多语种语音识别任务微调 Whisper 模型

本文提供了一个使用 Hugging Face &#x1f917; Transformers 在任意多语种语音识别 (ASR) 数据集上微调 Whisper 的分步指南。同时&#xff0c;我们还深入解释了 Whisper 模型、Common Voice 数据集以及微调等理论知识&#xff0c;并提供了数据准备和微调的相关代码。如果你想…

django-vue-admin 运行记录

django-vue-admin 运行记录 1. 安装 ubuntu-20.04.6 桌面版 ubuntu-20.04.6-desktop-amd64.iso 桌面版本 桌面版的目的是 有浏览器可以看 django vue 的localhost网页。 用server版&#xff0c;需要用别的机器看&#xff0c;别的机器在权限上可能有问题。 sudo apt install …

ChatGLM2-6B-Int4本地部署

原文链接&#xff1a;http://wangguo.site/posts/9d8c1768.html ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本 GitHub地址&#xff1a;https://github.com/THUDM/ChatGLM2-6B 1、先看效果 2、本地部署 部署环境 wsl2-ubuntu22.04 LTS-----------------------…

计网简答题

答案不保证正确性&#xff0c;仅供参考。 1.有如图所示的以太网&#xff0c;每个交换机的名字及接口号、主机的名字及MAC地址都标明在图中。网络初启动时&#xff0c;两个交换机的转发表都为空&#xff0c;接着先后进行以下MAC帧传输&#xff1a;H1→H5&#xff0c;H3→H2&…

PG系列5:PG体系结构

文章目录 一. PG体系结构1.1 PG的体系结构概述1.2 PostgreSQL进程概述 二. PG内存结构三. PostgreSQL进程3.1 后台进程3.2 后端进程(backend)或服务器进程3.3 用户进程或客户端进程3.4 数据库服务器启动流程 四. PG逻辑结构4.1 PostgreSQL cluster4.2 database和cluster的关系4…

DevExpress WPF Scheduler组件,快速构建性能优异的调度管理器!(上)

无论您在WPF项目中是需要Outlook样式的调度程序&#xff0c;还是需要时间表或议程视图来向最终用户展示信息&#xff0c;DevExpress WPF Scheduler都提供了数十个选项&#xff0c;如集成的日程对话框等&#xff0c;因此用户可以快速构建下一个伟大的调度管理器。 DevExpress W…

抖音本地生活团购服务商

抖音本地生活团购服务商市场前景非常广阔。随着移动互联网的普及和人们对本地生活服务需求的增加&#xff0c;本地生活团购行业已成为一个快速增长的市场。而抖音平台拥有庞大的用户基础和强大的社交媒体传播力&#xff0c;为本地生活团购服务商提供了巨大的发展机遇。 抖音…

刷题日记《链表02》

题目描述 给定两个 非空链表 l1和 l2 来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 解题思路 面对这种求和相加的题目&#xff0c;不知道…

windows 下安装 mysql-8.0.25 解压版

介绍 此文介绍 mysql-8.0.25-winx64 的 zip 解压版&#xff0c;在 windows 下的安装与配置过程。 官方下载 官网下载页&#xff1a; https://downloads.mysql.com/archives/community/ 进入官网&#xff0c;选择默认版本就行&#xff0c;不需要包含测试工具套件的版本 本地解…

C++ day40

1、思维导图 2、定义一个命名空间Myspace&#xff0c;包含以下函数&#xff1a;将一个字符串中的所有单词进行反转&#xff0c;并输出反转后的结果。例如&#xff0c;输入字符串为"Hello World"&#xff0c;输出结果为"olleH dlroW"&#xff0c;并在主函数…

0基础入门---第四章---误差反向传播法

&#x1f31e;欢迎来到深度学习的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f64f;作者水平很有限&#xff0c;如果发现错误&#xff…

Java性能权威指南-总结19

Java性能权威指南-总结19 Java EE性能调优JVM线程调优调节线程栈大小偏向锁自旋锁线程优先级 小结 Java EE性能调优Web容器的基本性能 Java EE性能调优 JVM线程调优 JVM的某些调优策略可以影响线程和同步的性能。 调节线程栈大小 当空间非常珍贵时&#xff0c;可以调节线程…

Day6——Web安全基础

网络安全学习笔记Day6 Web安全基础 一.Web简介什么是Web&#xff1f;什么是因特网&#xff1f;互联网&#xff0c;因特网&#xff0c;万维网的关系万维网构想的诞生http协议URL 二.Web发展史Web1.0Web2.01.0与2.0的区别Web1.0的安全漏洞Web2.0的安全漏洞 三.杂项门户网站静态页…

戴尔笔记本如何用U盘重装Win10系统?

戴尔笔记本如何用U盘重装Win10系统&#xff1f;很多使用戴尔笔记本的用户&#xff0c;都想知道如何用U盘来重装Win10系统&#xff0c;用户首先要确认自己的戴尔笔记本电脑能不能联网&#xff0c;然后再准备一个8G以上的U盘&#xff0c;最后根据小编分享的戴尔笔记本用U盘重装Wi…

Springboot Mybatis 不存在插入数据,存在则更新数据

前言 是不是经常看到代码&#xff0c; 查一下数据库&#xff0c;如果存在数据&#xff0c;就做更新语句调用&#xff1b; 如果不存在&#xff0c;就插入。 今天该篇介绍的 是使用 INSERT INTO ON DUPLICATE KEY UPDATE 来实现我们上述的场景&#xff0c; 不需要…

不能真“生成代码”的“低代码”平台,不可能获得程序员的认可

目录 前言 思考 解决问题 基本现状 发现亮点 前言 >前几天我和一个好友聊天的时候&#xff0c;他是这么评价低代码平台的&#xff1a;“想证明程序员都是傻X&#xff0c;又想让程序员买单&#xff01;程序员本身心里就不爽... ” 那么&#xff0c;低代码发展势头迅猛的…

Live800:客服系统如何帮助企业优化服务流程

随着互联网的发展和社会进步&#xff0c;客服服务已经成为企业经营中不可或缺的一部分&#xff0c;然而&#xff0c;客服服务一直以来都备受诟病&#xff0c;用户对客服人员的不满情绪也随之而来。显然企业急需提升客户服务质量&#xff0c;这就离不开客服系统的帮助。 那么&am…

Linux系统中的信号

信号是由用户、系统或者进程发送给目标进程的信息&#xff0c;以通知目标进程某个状态的改变或系统异常。Linux信号可由如下条件产生&#xff1a; 对于前台进程&#xff0c;用户可以通过输入特殊的终端字符来给它发送信号。比如输入CtrlC通常会给进程发送一个中断信号&#xf…

人类语言和机器语言

人类语言和机器语言是两种不同的语言形式&#xff0c;二者之间有很多异同点。人类语言是人们日常交流所使用的语言&#xff0c;也是一种自然语言&#xff0c;人类语言是非常复杂和多样化的&#xff0c;包括文字、口语、手语等等&#xff0c;而机器语言则是非常简单和规范化的一…

Maven项目,本地jar包导入手动导入到Maven库中

当你的项目&#xff0c;由于网络或者环境这些问题&#xff0c;无法从maven中央仓库更新jar包到本地的时候&#xff0c;可以尝试下面方法&#xff0c;手动添加jar包到Maven仓库&#xff1b; 方法一&#xff08;推荐&#xff09;&#xff1a; 1、需要先拿到你的jar包&#xff0…