仅供个人学习使用
目录
1. 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
2. Spring IOC 如何理解?
3. Spring DI 如何理解?
4. Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
5. Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
6. 描述Spring MVC处理流程及应用优势?
7. Spring中的事务处理方式及优缺点?
8. MyBatis应用中#与$有什么异同点?
9. MyBatis应用动态SQL解决了什么问题?
10. Shiro框架权限管理时的认证和授权流程描述?
11. BeanFactory和ApplicationContext有什么区别?
12. 请解释Spring Bean的生命周期?
13. Spring Bean的作用域之间有什么区别?
14. 在Spring AOP 中,关注点和横切关注的区别是什么?
15. 使用Spring框架的好处是什么?
16. Spring 中用到了那些设计模式?
17. Spring 如何保证 Controller 并发的安全?
18. 在 Spring中如何注入一个java集合?
19. Spring支持的事务管理类型?
20. Spring框架的事务管理有哪些优点?
21. Spring MVC的主要组件?
22. SpringMvc怎么和AJAX相互调用的?
23. mybatis的缓存机制,一级,二级介绍一下?
24. springMVC与Struts2的区别?
25. mybatis的基本工作流程?
26. 什么是MyBatis的接口绑定,有什么好处?
27.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
1. 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
- Spring Bean容器是Spring框架的核心,负责实例化、配置和组装对象。这些对象被称为Beans,它们由Spring IoC容器管理。IoC(控制反转)是一种设计原则,用于降低计算机代码之间的耦合度,Spring IoC容器是实现这一原则的框架。
- Spring Bean容器和Spring IoC容器实际上是同一个概念,只是不同的叫法。在Spring中,IoC容器负责管理Bean的生命周期和依赖关系。
2. Spring IOC 如何理解?
Spring IoC容器是一个管理对象的工厂,它负责创建对象、管理对象的生命周期、配置对象以及管理对象之间的依赖关系。IoC容器通过读取配置元数据(例如XML配置文件、注解或Java配置类)来了解需要创建哪些对象,以及如何配置它们。
3. Spring DI 如何理解?
DI(依赖注入)是IoC的一个核心组成部分,它是一种实现IoC的技术。DI允许对象之间的依赖关系被注入到对象中,而不是由对象自己创建或查找依赖。这通常通过构造函数注入、字段注入或setter注入实现。
4. Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
- 在Spring中,可以通过
@Scope
注解来配置对象的作用域,例如@Scope("singleton")
表示单例模式,@Scope("prototype")
表示原型模式。- 延迟加载机制可以通过
@Lazy
注解实现,它告诉Spring容器在首次请求Bean时才创建Bean,而不是在启动时。
5. Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
- Spring工厂底层构建Bean对象主要借助于工厂模式和反射机制。工厂模式用于创建对象,反射用于在运行时动态地创建对象和调用方法。
- 当对象不使用时释放资源的目的是为了避免内存泄漏。内存泄漏是指程序在申请内存后,无法释放已经申请的内存空间,导致内存的浪费,最终可能导致程序崩溃或系统性能下降。
6. 描述Spring MVC处理流程及应用优势?
- Spring MVC处理流程大致如下:用户发送请求 -> 前端控制器DispatcherServlet接收请求 -> HandlerMapping将请求映射到对应的处理器(Controller)-> Controller处理请求并返回ModelAndView -> ViewResolver解析视图 -> 返回响应给用户。
- 应用优势包括:分离关注点、模块化和可测试性、灵活性和可扩展性、集成其他视图技术等。
7. Spring中的事务处理方式及优缺点?
- 处理方式:
- 编程式事务管理:通过编码方式直接使用
PlatformTransactionManager
来管理事务,这种方式灵活但代码重复且难以维护。- 声明式事务管理:使用AOP在方法上添加事务属性,这是最常见的方式,通过
@Transactional
注解来声明事务的边界和属性。- 优点:
- 声明式事务管理减少了样板代码,使业务代码更清晰。
- 事务管理与业务逻辑分离,提高了代码的可维护性。
- 可以灵活地配置事务属性,如隔离级别、传播行为等。
- 缺点:
- 声明式事务可能不如编程式事务灵活,因为它依赖于框架的配置。
- 如果配置不当,可能会导致事务行为不符合预期。
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通过Realm来验证这些信息,Realm负责与数据库或其他数据源交互以确认用户身份。
- 如果验证成功,Shiro会创建一个
Subject
实例,代表当前用户的安全上下文。- 授权(Authorization):
- 一旦用户被认证,Shiro会根据用户的角色或权限来确定他们可以访问哪些资源。
- 授权可以在代码中通过编程方式检查,也可以通过注解或配置文件来定义。
- Shiro支持细粒度的权限控制,包括角色基础的权限控制和权限基础的权限控制。
11. BeanFactory和ApplicationContext有什么区别?
BeanFactory
是Spring框架的基础设施,提供配置框架和基本功能,是Spring的核心接口。ApplicationContext
是BeanFactory
的子接口,提供了更多高级功能,如事件传播、国际化消息支持、资源访问等。ApplicationContext
通常用于应用程序的整个生命周期,而BeanFactory
更多用于轻量级的容器。ApplicationContext
支持更多的Bean后处理机制,如BeanPostProcessor
。
12. 请解释Spring Bean的生命周期?
- 实例化: Bean的定义被加载并实例化。
- 属性赋值: 设置Bean属性和依赖。
- BeanNameAware, BeanFactoryAware: 如果Bean实现了这些接口,它们的相关方法会被调用。
- InitializingBean, init-method: 如果Bean实现了
InitializingBean
接口或指定了init-method
,它们的初始化方法会被调用。- 使用Bean: 完成初始化后,Bean可以被应用程序使用了。
- DisposableBean, destroy-method: 当容器关闭时,如果Bean实现了
DisposableBean
接口或指定了destroy-method
,它们的销毁方法会被调用。
13. Spring Bean的作用域之间有什么区别?
- singleton(单例): 默认作用域,每个Spring IoC容器中相同Bean定义只创建一个Bean实例。
- prototype(原型): 每次请求都会创建一个新的Bean实例。
- request: 每个HTTP请求都会创建一个新的Bean,仅适用于WebApplicationContext环境。
- session: 在一个HTTP Session中,一个Bean定义对应一个Bean实例。
- application: 每个ServletContext会创建一个Bean实例,仅适用于WebApplicationContext环境。
- websocket: 对于每个WebSocket会话,一个Bean定义对应一个Bean实例,仅适用于WebApplicationContext环境。
14. 在Spring AOP 中,关注点和横切关注的区别是什么?
- 关注点(Concern): 在软件工程中,关注点是指在特定场景下需要考虑的特定功能或行为。例如,日志记录、事务管理、安全性等都可以是关注点。
- 横切关注(Cross-cutting concern): 横切关注是指那些影响多个模块或组件的关注点,它们通常会跨越整个应用的多个点。在Spring AOP中,横切关注通常通过切面(Aspect)来实现,切面定义了横切关注点的逻辑,并可以应用到多个不同的业务逻辑上。
15. 使用Spring框架的好处是什么?
- 简化开发: 提供了丰富的模板代码,减少了手动配置和编码的工作量。
- 松耦合: 通过依赖注入(DI)和面向切面编程(AOP),Spring帮助开发者实现组件之间的松耦合。
- 声明式事务管理: 提供了简单而强大的事务管理机制。
- 集成多种技术: 可以轻松集成各种不同的技术,如JPA、Hibernate、JMS等。
- 测试友好: 支持模拟对象和测试,使得单元测试更加容易。
- 灵活性: 提供了多种配置方式,包括XML、注解和Java配置。
- 社区和文档: 拥有一个活跃的社区和丰富的文档资源。
16. Spring 中用到了那些设计模式?
- 工厂模式: 通过
BeanFactory
创建对象实例。- 单例模式: Spring容器默认以单例模式创建Bean。
- 代理模式: AOP功能使用代理模式来动态地添加额外的行为。
- 策略模式: 通过不同的策略实现不同的行为。
- 模板方法模式: 在数据访问对象(DAO)支持中,提供了模板方法定义了操作的骨架。
- 观察者模式: 应用事件传播机制中使用。
- 装饰器模式: 通过
BeanPostProcessor
和BeanFactoryPostProcessor
等后处理器增强Bean。
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支持的事务管理类型?
- 编程式事务管理: 通过
PlatformTransactionManager
编程式地管理事务。- 声明式事务管理: 使用
@Transactional
注解来声明事务边界和属性。- 基于XML的声明式事务管理: 在XML配置文件中使用
<tx:*>
标签定义事务属性。- 基于注解的声明式事务管理: 使用
@Transactional
注解在类或方法上声明事务属性。
20. Spring框架的事务管理有哪些优点?
- 简化编程模型: 通过声明式事务管理简化了事务代码。
- 一致性: 通过统一的事务管理API,确保了事务管理的一致性。
- 可重用性: 事务管理代码可以跨不同的应用和组件重用。
- 可扩展性: 支持多种事务管理器,如JTA、JPA、Hibernate等。
- 非侵入性: 事务管理不依赖于特定的ORM框架,可以与任何数据访问技术一起使用。
- 灵活的事务属性配置: 可以灵活地配置事务的隔离级别、传播行为等属性。
21. Spring MVC的主要组件?
- DispatcherServlet: 作为前端控制器,它接收所有的HTTP请求,并将其转发到具体的Controller处理。
- Controller: 处理用户的请求,并返回ModelAndView或直接返回视图。
- Model: 包含应用程序数据,通常作为Controller的输出和视图的输入。
- View: 负责展示数据,可以是JSP、Thymeleaf、Freemarker等模板引擎生成的HTML页面。
- ViewResolver: 用于解析具体的View。
- HandlerMapping: 负责映射Web请求到对应的Controller。
- HandlerAdapter: 负责将Handler(Controller)的输出转换为ModelAndView。
- ModelAndView: 包含模型数据和视图信息。
- HttpServletRequest 和 HttpServletResponse: 表示HTTP请求和响应对象。
22. SpringMvc怎么和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的区别?
- 入口不同: Spring MVC使用DispatcherServlet作为前端控制器,而Struts2使用Filter作为入口。
- 配置方式: Spring MVC支持注解和XML配置,而Struts2主要使用XML配置。
- 拦截器: Struts2使用拦截器(Interceptor)机制,Spring MVC使用Aspect Oriented Programming (AOP)。
- 标签库: Struts2提供了丰富的标签库,而Spring MVC没有。
- 结果视图: Spring MVC支持多种视图技术,而Struts2主要使用JSP。
25. mybatis的基本工作流程?
- 配置MyBatis和数据源。
- 通过SqlSessionFactoryBuilder创建SqlSessionFactory。
- 通过SqlSessionFactory创建SqlSession。
- 通过SqlSession执行命令,查询数据库或插入、更新数据。
- 通过Executor执行SQL语句。
- 将结果集映射到Java对象。
- 提交事务或回滚。
- 关闭SqlSession。
26. 什么是MyBatis的接口绑定,有什么好处?
- 接口绑定是指MyBatis通过接口和XML映射文件将SQL语句与Java方法关联起来。
- 好处包括:提高了代码的可读性和可维护性,使得SQL语句与Java代码分离,便于管理。
27.JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
- JDBC的不足: 代码重复性高,数据库操作代码与业务逻辑代码耦合,缺乏足够的灵活性。
- MyBatis的解决方案: 提供了SQL映射文件,减少了代码重复;将数据库操作与业务逻辑分离;通过XML或注解配置SQL语句,提高了灵活性。
- MyBatis的优缺点?
- 优点: 性能好,灵活,支持动态SQL,易于维护和学习。
- 缺点: 需要手动编写SQL语句,对于复杂的查询可能需要编写大量的XML配置,可能会增加开发工作量。