Spring面试题

1. 何为Spring Bean容器?Spring Bean容器与Spring IOC容器有什么不同吗?

答案
Spring Bean容器是Spring框架中用于管理Bean(即Java对象)的容器,负责Bean的创建、配置、组装和管理。Spring IOC(控制反转)容器是Bean容器的具体实现,它通过依赖注入(DI)机制来实现控制反转。实际上,Spring Bean容器和Spring IOC容器是同一个概念,通常互换使用,但IOC容器更强调控制反转的原则。


2. Spring IOC如何理解?

答案
Spring IOC(控制反转)是一种设计原则,它将对象的创建和依赖关系的管理从应用程序代码中转移到容器中。容器负责实例化、配置和组装Bean,从而降低组件之间的耦合度。IOC通过依赖注入(DI)实现,使得对象不需要直接创建依赖对象,而是由容器注入。


3. Spring DI如何理解?

答案
Spring DI(依赖注入)是IOC的具体实现方式,指容器在运行时动态地将依赖对象注入到目标对象中。主要有三种注入方式:构造器注入、Setter方法注入和字段注入。DI减少了代码的耦合性,提高了可测试性和可维护性。


4. Spring中基于注解如何配置对象作用域?以及如何配置延迟加载机制?

答案

  • 作用域配置:使用@Scope注解,例如@Scope("singleton")@Scope("prototype")

  • 延迟加载:使用@Lazy注解,例如@Lazy(true),表示Bean在第一次被请求时才初始化。


5. Spring工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?

答案

  • 构建机制:Spring通过反射机制动态创建Bean实例。

  • 释放资源目的:避免资源浪费和提高性能,防止内存泄漏。

  • 内存泄漏:指程序中已分配的内存未能正确释放,导致内存占用持续增加,最终可能引发程序崩溃。


6. 描述Spring MVC处理流程及应用优势?

答案

  • 处理流程

    1. 用户请求发送到DispatcherServlet。

    2. DispatcherServlet查询HandlerMapping找到对应的Controller。

    3. Controller处理请求并返回ModelAndView。

    4. ViewResolver解析视图名称。

    5. 视图渲染并返回响应。

  • 优势:松散耦合、易于测试、支持注解驱动、集成灵活。


7. Spring中的事务处理方式及优缺点?

答案

  • 方式:编程式事务(代码中手动管理)和声明式事务(通过注解或XML配置)。

  • 优缺点

    • 编程式:灵活但代码侵入性强。

    • 声明式:简洁但调试复杂。


8. MyBatis应用中#与$有什么异同点?

答案

  • #是预编译处理,防止SQL注入,适用于参数传递。

  • $是字符串拼接,有SQL注入风险,适用于动态表名或列名。

  • 相同点:都用于MyBatis映射文件中引用参数。


9. MyBatis应用动态SQL解决了什么问题?

答案
动态SQL解决了根据条件动态生成SQL语句的问题,避免了在Java代码中拼接SQL的繁琐和错误,提高了代码可读性和维护性。


10. Shiro框架权限管理时的认证和授权流程描述?

答案

  • 认证:用户提供凭证(如用户名/密码),Shiro验证身份。

  • 授权:认证成功后,Shiro根据用户角色和权限检查访问资源是否被允许。


11. BeanFactory和ApplicationContext有什么区别?

答案

  • BeanFactory是基础容器,提供基本DI功能,延迟加载Bean。

  • ApplicationContext是高级容器,扩展了BeanFactory,支持事件发布、国际化等,默认即时加载Bean。


12. 请解释Spring Bean的生命周期?

答案

  1. 实例化Bean

  2. 依赖注入

  3. 调用BeanNameAware方法

  4. 调用BeanFactoryAware方法

  5. 调用PreInitialization方法(BeanPostProcessor)

  6. 调用InitializingBean的afterPropertiesSet方法

  7. 调用自定义init方法

  8. 调用PostInitialization方法(BeanPostProcessor)

  9. Bean就绪

  10. 容器关闭时调用DisposableBean的destroy方法或自定义destroy方法。


13. Spring Bean的作用域之间有什么区别?

答案

  • singleton:每个容器一个Bean实例(默认)。

  • prototype:每次请求新实例。

  • request:每个HTTP请求新实例(Web环境)。

  • session:每个HTTP会话新实例(Web环境)。

  • globalSession:全局HTTP会话(Portlet环境)。


14. 使用Spring框架的好处是什么?

答案

  • 降低耦合度,提高模块化。

  • 方便测试,支持依赖注入。

  • 提供声明式事务管理。

  • 集成其他框架(如Hibernate、MyBatis)。

  • 支持AOP,增强功能。


15. Spring中用到了那些设计模式?

答案
工厂模式、单例模式、代理模式、模板方法模式、观察者模式、适配器模式等。


16. Spring如何保证Controller并发的安全?

答案
Spring Controller默认是单例的,但通过避免使用实例变量(改为使用局部变量或ThreadLocal)来保证线程安全。建议Controller设计为无状态。


17. 在Spring中如何注入一个java集合?

答案
在XML配置中使用<list><set><map>等标签,或在注解中使用@Autowired注入集合类型。


18. Spring支持的事务管理类型?

答案
编程式事务和声明式事务。声明式事务又基于XML或注解(如@Transactional)。


19. Spring框架的事务管理有哪些优点?

答案

  • 统一的事务管理接口。

  • 支持声明式事务,减少代码侵入。

  • 集成多种事务资源(如JDBC、Hibernate)。

  • 提供事务传播行为和隔离级别配置。


20. Spring MVC的主要组件?

答案
DispatcherServlet、HandlerMapping、Controller、ViewResolver、View等。


21. SpringMvc怎么和AJAX相互调用的?

答案
Controller方法返回JSON数据(使用@ResponseBody@RestController),前端通过AJAX请求调用这些方法。


22. mybatis的缓存机制,一级,二级介绍一下?

答案

  • 一级缓存:SqlSession级别,默认开启,在同一个SqlSession中有效。

  • 二级缓存:Mapper级别,需手动开启,跨SqlSession共享数据。


23. SpringMVC与Struts2的区别?

答案

  • Spring MVC基于方法拦截,Struts2基于类拦截。

  • Spring MVC集成更紧密,Struts2配置更复杂。

  • Spring MVC性能更高,Struts2漏洞较多。


24. mybatis的基本工作流程?

答案

  1. 加载配置(XML或注解)。

  2. 创建SqlSessionFactory。

  3. 创建SqlSession。

  4. 执行SQL。

  5. 返回结果。

  6. 关闭SqlSession。


25. 什么是MyBatis的接口绑定,有什么好处?

答案
接口绑定指MyBatis将Mapper接口与XML映射文件关联,通过动态代理实现。好处是无需编写实现类,代码更简洁。


26. MyBatis的编程步骤?

答案

  1. 创建SqlSessionFactory。

  2. 创建SqlSession。

  3. 获取Mapper接口实例。

  4. 调用Mapper方法。

  5. 提交事务(如需)。

  6. 关闭SqlSession。


27. JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?

答案

  • JDBC不足:代码冗余、手动处理连接和结果集、SQL注入风险。

  • MyBatis解决:自动映射、参数预编译、提供缓存机制。


28. MyBatis的优缺点?

答案

  • 优点:灵活、SQL可控、性能好。

  • 缺点:需手动编写SQL、移植性差。


29. 谈谈你对SpringMVC的理解?

答案
Spring MVC是基于Spring的Web框架,采用MVC模式,通过DispatcherServlet核心控制器处理请求,支持注解驱动和视图解析。


30. 简述Mybatis的插件运行原理,以及如何编写一个插件?

答案

  • 原理:基于动态代理,拦截Executor、StatementHandler等组件的方法。

  • 编写插件:实现Interceptor接口,重写intercept方法,并配置@Intercepts注解。


31. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?

答案
支持。原理是通过动态代理,在访问关联对象时才触发SQL查询。


32. Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?

答案
能。方式:

  • 嵌套查询:分多次SQL查询。

  • 嵌套结果:单次SQL连接查询。
    区别:嵌套查询有N+1问题,但灵活;嵌套结果效率高但SQL复杂。


33. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

答案
通过反射或结果映射(ResultMap)。映射形式:自动映射(基于列名)和手动映射(指定ResultMap)。


34. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?

答案
B标签可以定义在A标签后面,MyBatis解析时会将整个XML文档加载后再处理引用。


35. MyBatis里面的动态Sql是怎么设定的?用什么语法?

答案
使用OGNL表达式,在XML中通过<if><choose><foreach>等标签实现。


36. Mybatis都有哪些Executor执行器?它们之间的区别是什么?

答案

  • SimpleExecutor:每次执行新Statement。

  • ReuseExecutor:复用Statement。

  • BatchExecutor:批量执行。
    区别在于性能和资源管理。


37. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?

答案
Mybatis需手动编写SQL,而全自动ORM(如Hibernate)自动生成SQL。半自动更灵活,全自动更便捷。


38. 简单介绍下你对mybatis的理解?

答案
MyBatis是持久层框架,封装了JDBC,通过XML或注解配置SQL,支持动态SQL和缓存,简化数据库操作。


39. 介绍一下Spring的事物管理?

答案
Spring提供统一事务管理,支持编程式和声明式事务,基于AOP实现,可配置传播行为和隔离级别。


40. SSM优缺点、使用场景?

答案

  • 优点:轻量级、灵活、集成简单。

  • 缺点:配置较复杂。

  • 使用场景:中小型Web项目,需灵活SQL控制。


41. SpringMVC的工作流程?

答案
同问题6的处理流程。


42. 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?

答案
同问题23。


43. 怎么样把数据放入Session里面?

答案
在Controller中使用HttpSessionsetAttribute方法,例如session.setAttribute("key", value)


44. 讲下SpringMvc的执行流程?

答案
同问题6。


45. MyBatis(IBatis)的好处是什么?

答案
简化JDBC代码、SQL可控、缓存机制、动态SQL支持。


46. 解释Spring支持的几种bean的作用域?

答案
同问题13。


47. 什么是bean的自动装配?

答案
Spring容器自动注入依赖关系,无需明确配置。方式:byName、byType、constructor等。


48. 什么是基于Java的Spring注解配置? 给一些注解的例子?

答案
使用注解替代XML配置。例子:@Component@Autowired@Configuration@Bean


49. 使用Spring通过什么方式访问Hibernate?

答案
通过HibernateTemplate或使用@Repository注解结合Hibernate SessionFactory。


50. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?

答案
继承HibernateDaoSupport类,并注入SessionFactory,使用getHibernateTemplate()方法操作数据库。


51. 在Spring AOP中,连接点和切入点的区别是什么?

答案

  • 连接点:程序执行的点(如方法调用)。

  • 切入点:匹配连接点的表达式,定义哪些连接点被拦截。


52. AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知?

答案

  • 作用:解耦横切关注点(如日志、事务)。

  • 底层实现:动态代理(JDK或CGLIB)。

  • 使用场景:事务管理、安全、日志。

  • 切面:模块化横切关注点的类。

  • 切入点:定义拦截规则。

  • 通知:切面在连接点执行的动作(如前置、后置通知)。


53. Spring中AutoWired和Resource之间区别是什么?

答案

  • @Autowired按类型注入,是Spring注解。

  • @Resource按名称注入,是J2EE注解。

  • @Autowired需配合@Qualifier指定名称,@Resource默认按名称。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值