SSM相关面试题01
目录
1.何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
4.Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
5.Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
11. BeanFactory和ApplicationContext有什么区别?
14. 在Spring AOP 中,关注点和横切关注的区别是什么?
17. Spring 如何保证 Controller 并发的安全?
22. Spring MVC 怎么和 AJAX 相互调用的?
1.何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
Spring Bean 容器 是 Spring 框架的核心,负责管理应用中所有的对象(Bean)。它通过配置文件(XML)或注解扫描的方式,读取 Bean 的定义并创建、初始化、配置和管理这些 Bean 的生命周期。Bean 容器还负责依赖注入(DI)和控制反转(IOC),确保 Bean 之间的依赖关系能够自动建立。
Spring IOC 容器是 Spring 框架的核心概念之一。它是一种控制反转的设计模式,意味着对象的创建和管理不由程序员控制,而是交给 Spring 框架来处理,用于降低计算机代码之间的耦合度。
区别:
- Spring IOC 容器 是整个容器的功能层面,涉及控制反转的实现。
- Spring Bean 容器 具体指实现了 IOC 容器功能的 Spring 容器,负责管理 Bean 的生命周期,创建、销毁 Bean。
2.Spring IOC 如何理解?
IOC是一种设计模式,其核心思想是将控制权从程序员手中转移到容器中,即让容器负责对象的创建、初始化和依赖注入。Spring 框架通过提供一个容器,负责管理应用中对象的生命周期,并通过配置文件或注解来声明对象的依赖关系。
IOC 容器 在启动时会创建并初始化应用中的所有 Bean,自动注入它们之间的依赖关系,程序员只需要关注业务逻辑,容器负责其他的细节。
3.Spring DI 如何理解?
DI(Dependency Injection,依赖注入) 是一种实现 IOC 的方式,是 Spring 框架的核心功能之一。它通过将类的依赖关系(如对象、服务)自动注入到类的实例中,而不是由类自己创建依赖对象。DI 可以通过构造器注入、Setter 方法注入和字段注入等方式进行。
依赖注入的好处:
- 降低了类与类之间的耦合度,提高了系统的灵活性和可测试性。
- 使得对象的创建和管理交给 Spring 容器,简化了代码。
4.Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
对象作用域(Scope):在 Spring 中,常见的作用域有单例(singleton)和原型(prototype)等。可以通过 @Scope 注解来配置对象的作用域。
- @Scope("singleton"):表示一个 Bean 在 Spring 容器中只有一个实例(默认作用域)单例模式。
- @Scope("prototype"):表示每次请求都会创建一个新的 Bean 实例。
- @Scope("request"):表示每个 HTTP 请求一个 Bean 实例(适用于 web 环境)。
- @Scope("session"):表示每个 HTTP 会话一个 Bean 实例(适用于 web 环境)。
延迟加载(Lazy Initialization):通过 @Lazy 注解可以将 Bean 的加载延迟到它首次使用时。
5.Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
Spring 工厂底层构建 Bean 对象时,借助了 反射机制 和 工厂设计模式。Spring 会通过反射创建 Bean 的实例,并根据 Bean 的定义(如构造器、Setter 方法等)来注入依赖。
当对象不使用时,Spring 会通过容器的 垃圾回收机制 来销毁 Bean,释放资源,目的是为了避免内存泄漏。
内存泄漏 是指程序不再使用某个对象,但由于某种原因,该对象仍然保留在内存中,导致无法被垃圾回收,从而消耗内存资源。
6.描述Spring MVC处理流程及应用优势?
Spring MVC 是基于请求驱动的 Web 框架,它采用了前端控制器模式,主要包括以下步骤:
- 请求:用户发送 HTTP 请求到前端控制器(DispatcherServlet)。
- 请求映射:DispatcherServlet 将请求映射到对应的处理器 Controller(根据请求 URL 和映射规则)。
- 处理业务逻辑:Controller 处理业务逻辑并返回一个 ModelAndView 对象,包含了模型数据和视图信息。
- 视图解析:DispatcherServlet 通过视图解析器(ViewResolver)来解析视图。
- 响应:最终渲染视图并将响应返回给用户。
优势:
- 解耦:前端控制器、业务逻辑和视图渲染的解耦,方便维护和扩展。
- 灵活性:支持多种视图技术(JSP、FreeMarker、Thymeleaf 等)。
- 可测试性:业务逻辑和控制层分离,便于单元测试。
7.Spring中的事务处理方式及优缺点?
Spring 提供了声明式和编程式事务管理方式:
声明式事务管理
使用 AOP(面向切面编程)在方法上添加事务属性,通过注解(如 @Transactional)或 XML 配置来定义事务边界。
- 优点:简单易用,灵活,分离了业务逻辑和事务控制。
- 缺点:不支持复杂的事务操作,无法在运行时动态控制事务。
编程式事务管理
通过 TransactionTemplate 或 PlatformTransactionManager 显式管理事务,手动编写事务的开始、提交和回滚。
- 优点:可以灵活控制事务的具体行为。
- 缺点:代码耦合度高,不够简洁。
8. MyBatis应用中#与$有什么异同点?
#{}:
- 用于预处理语句(prepared statements),可以防止SQL注入攻击。
- MyBatis会将传入的参数与SQL语句中的占位符替换时进行转义处理。
${}:
- 直接将传入的参数拼接到SQL中,容易受到SQL注入攻击。
- 通常用于那些无法使用预处理语句的场景,如动态表名、列名、排序字段等。
异同点:
- 相同点:都是用来替换SQL语句中的参数。
- 不同点:#{}是安全的参数替换方式,而${}则不安全;${}可以用于动态SQL,而#{}不行。
9. MyBatis应用动态SQL解决了什么问题?
- 动态SQL解决了在不同情况下需要执行不同SQL语句的问题,它允许在运行时根据条件构建SQL语句。
- 它使得SQL语句更加灵活,可以根据业务逻辑的变化快速调整SQL,而不需要修改数据库结构或重新编写大量的SQL代码。
- 动态SQL通过 <if>、<choose>、<when>、<otherwise> 等标签实现了条件判断和分支选择,使得SQL语句可以根据复杂的业务逻辑动态生成。
10. Shiro框架权限管理时的认证和授权流程描述
认证(Authentication):
- 用户向 Shiro 提交身份信息(如用户名和密码)。
- Shiro 使用 Authenticator 检查用户身份,验证信息的正确性。
- 如果身份验证成功,Shiro 会将用户信息存储在 Subject 中。
授权(Authorization):
- 用户访问需要权限控制的资源时,Shiro 会通过 Authorizer 检查该用户是否有访问该资源的权限。
- Shiro 会检查用户是否属于某个角色或拥有特定的权限。
- 如果授权通过,用户可以访问资源;否则,Shiro 会拒绝访问或重定向到登录页面。
总结:
- 认证 是确保用户身份的合法性。
- 授权 是确保用户具有访问某个资源的权限
11. BeanFactory和ApplicationContext有什么区别?
- BeanFactory
是 Spring 中最基本的容器,负责加载 Bean 和管理 Bean 的生命周期。它通过延迟加载(Lazy Initialization)加载 Bean,只有在 Bean 被请求时才创建实例。
- ApplicationContext
是 BeanFactory 的子接口,继承了 BeanFactory 的功能,并扩展了更多功能,比如事件传播、AOP 支持、国际化消息处理等。相比于 BeanFactory,ApplicationContext 是更常用的容器,通常会立即加载所有的 Bean(除非显式指定延迟加载)。
区别:
- 功能:ApplicationContext 提供了更多的功能,如事件处理、国际化支持、自动装配等,适用于更多的应用场景。
- 加载方式:BeanFactory 采用懒加载,而 ApplicationContext 一般采用提前加载所有 Bean(即在容器初始化时)。
12. 请解释Spring Bean的生命周期?
- 实例化:Spring 容器通过反射创建 Bean 实例。
- 设置属性:Spring 会通过依赖注入(DI)将所需的依赖注入到 Bean 中。
- Bean 名称回调:如果实现了 BeanNameAware 接口,Spring 会调用 setBeanName() 方法,将 Bean 名称传递给 Bean。
- BeanFactory 回调:如果实现了 BeanFactoryAware 接口,Spring 会调用 setBeanFactory() 方法,将 BeanFactory 传递给 Bean。
- 应用上下文回调:如果实现了 ApplicationContextAware 接口,Spring 会调用 setApplicationContext() 方法,将 ApplicationContext 传递给 Bean。
- 初始化:如果 Bean 定义了初始化方法(如 @PostConstruct 或 XML 配置中的 init-method),Spring 会调用该方法。
- Bean 使用:此时 Bean 可以被 Spring 容器管理并被应用程序使用。
- 销毁:如果 Bean 定义了销毁方法(如 @PreDestroy 或 XML 配置中的 destroy-method),当容器销毁时,Spring 会调用该方法。
13. Spring Bean的作用域之间有什么区别?
- singleton(单例):在整个 Spring 容器中,只有一个 Bean 实例。默认作用域。
- prototype(原型):每次请求都会创建一个新的 Bean 实例。
- request(请求):每个 HTTP 请求一个 Bean 实例,仅适用于 Web 环境。
- session(会话):每个 HTTP 会话一个 Bean 实例,仅适用于 Web 环境。
- application(应用):每个 Web 应用一个 Bean 实例,仅适用于 Web 环境。
- websocket(WebSocket):每个 WebSocket 会话一个 Bean 实例,仅适用于 Web 环境。
区别:
- singleton 和 prototype 是最常见的,前者是单例的,后者是每次请求都会创建一个新的实例。
- Web 相关作用域(request, session, application, websocket)主要用于 Web 应用中,它们与 HTTP 请求和会话生命周期关联。
14. 在Spring AOP 中,关注点和横切关注的区别是什么?
- 关注点(Concern):是指应用程序中的特定功能或行为。例如,业务逻辑是一个关注点,日志记录、安全性检查等也是关注点。
- 横切关注(Cross-cutting Concern):指跨越多个模块或业务逻辑的关注点。比如日志记录、事务管理、安全控制等。这些关注点横跨应用的多个层次,不局限于某一个特定功能模块。
在 AOP 中,横切关注被抽象为切面(Aspect),它可以在不修改业务逻辑的情况下,统一处理这些跨模块的需求。
15. 使用Spring框架的好处是什么?
- 简化开发:Spring 提供了许多开箱即用的功能,如依赖注入(DI)、面向切面编程(AOP)、事务管理等,简化了开发工作。
- 松耦合:通过 IOC 和 DI,Spring 使得不同模块之间的耦合度大大降低,方便维护和测试。
- 更好的可测试性:Spring 容器管理 Bean,使得可以轻松替换和注入依赖,促进单元测试的实施。
- 跨平台支持:Spring 提供了与不同数据源、消息队列、事务管理器等集成的支持,减少了对底层技术的依赖。
- 灵活性和可扩展性:Spring 提供了丰富的模块,用户可以根据实际需要选择和组合模块。
16. Spring 中用到了那些设计模式?
- 工厂模式:Spring 的 BeanFactory 和 ApplicationContext 实现了工厂模式,用于创建和管理 Bean 实例。
- 单例模式:Spring 默认使用单例模式管理 Bean,每个 Bean 只有一个实例。
- 代理模式:AOP 使用代理模式来创建代理对象,管理方法的拦截和增强。
- 模板方法模式:Spring 提供了多种模板类,如 JdbcTemplate、JmsTemplate,简化了资源管理。
- 观察者模式:Spring 的事件机制基于观察者模式,允许监听和响应事件。
- 策略模式:Spring 中的多种策略接口,如事务管理、视图解析器等,允许通过不同的策略实现不同的功能。
17. Spring 如何保证 Controller 并发的安全?
- 无状态: 确保Controller是无状态的,这样多个请求可以在不同的线程中并发处理同一个Controller实例。
- 线程安全: 使用线程安全的类和方法,或者避免在Controller中使用全局状态。
- 局部变量: 使用局部变量来存储每个请求的状态。
- 同步: 对于需要同步访问的资源,使用同步代码块或锁。
- 并发注解: 使用@Synchronized注解(非Spring官方提供)来同步方法。
18. 在 Spring中如何注入一个java集合?
- 可以通过XML配置或注解来注入集合类型的Bean。例如,使用@Autowired注解和List、Set等集合类型。
- 在XML配置中,可以使用<list>、<set>或<map>标签来定义集合,并注入到Bean的属性中。
- 也可以使用@PropertySource注解指定属性文件,并使用@Property注解将属性文件中的值注入到集合中。
19. Spring支持的事务管理类型?
- 声明式事务管理:通过 AOP(面向切面编程)和 @Transactional 注解或 XML 配置来声明事务的边界,简化了事务管理。
- 编程式事务管理:使用 TransactionTemplate 或 PlatformTransactionManager 通过编程的方式显式管理事务。
20. Spring框架的事务管理有哪些优点?
- 简化事务管理:通过声明式事务管理,开发人员无需编写复杂的事务管理代码,避免了事务处理的繁琐。
- 跨数据库支持:Spring 提供对多种数据库事务的支持,可以通过不同的事务管理器来处理各种数据库事务。
- 灵活性:可以支持本地事务、分布式事务和异步事务等。
- 隔离性和一致性:Spring 支持配置事务的隔离级别和传播行为,保证了事务的 ACID 特性。
21. Spring MVC的主要组件?
-
DispatcherServlet:前端控制器,负责接收和分发请求。
-
Controller:处理用户请求的核心组件。
-
HandlerMapping:根据请求 URL 查找相应的 Controller。
-
ViewResolver:根据模型和视图名称解析视图。
-
ModelAndView:封装了模型数据和视图信息的对象。
22. Spring MVC 怎么和 AJAX 相互调用的?
-
在Spring MVC中,可以通过在Controller中添加方法来处理AJAX请求。这些方法通常返回@ResponseBody注解的数据,这些数据可以直接被AJAX调用处理。
-
在前端,使用JavaScript(或jQuery等库)发起AJAX请求,并将请求发送到Spring MVC的Controller。
-
Controller处理请求后,返回JSON或XML格式的响应数据,AJAX调用接收这些数据并进行相应的处理,如更新页面元素。
23. MyBatis 的缓存机制,一级,二级介绍一下?
- 一级缓存(Local Cache): 也称为SqlSession级别的缓存,每个SqlSession都有自己的一级缓存,当查询相同的Namespace和SQL时,会直接从一级缓存中获取数据,而不是再次查询数据库。
- 二级缓存(Global Cache): 可以跨SqlSession共享,需要手动开启。二级缓存可以减少对数据库的访问次数,提高性能。但是,它也增加了复杂性,并且需要处理缓存的一致性问题。
24. SpringMVC 与 Struts2 的区别?
-
架构设计:
- SpringMVC:基于 DispatcherServlet 作为前端控制器,采用轻量级的控制器与视图分离。
- Struts2:基于 Action 类进行控制,整体架构相对较重,且有很多内置功能。
-
灵活性:
- SpringMVC:通过配置和注解提供了更灵活的映射机制。
- Struts2:配置复杂,基于 XML 和注解,但扩展性相对较低。
-
功能:
- SpringMVC:专注于 Web 层,并与 Spring 框架的其他组件(如事务、AOP)无缝集成。
- Struts2:具有更多内建功能,如拦截器、表单标签等。
-
依赖:
- SpringMVC:作为 Spring 的一部分,依赖 Spring 容器。
- Struts2:独立框架,虽然可以集成 Spring,但不依赖于 Spring。
25. MyBatis 的基本工作流程?
-
配置文件:加载 MyBatis 配置文件 (
SqlMapConfig.xml
),包括数据库连接、事务管理等信息。 -
SqlSessionFactory:通过
SqlSessionFactoryBuilder
创建SqlSessionFactory
,然后获取SqlSession
。 -
SqlSession:执行命令,查询数据库或插入、更新数据。
-
通过Executor执行SQL语句。
-
将结果集映射到Java对象。
-
提交事务或回滚。
-
关闭SqlSession。
原文地址:https://blog.csdn.net/jlihan/article/details/144108309
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!