ssm面试六十题
1.1 何为Spring Bean容器?Spring Bean容器与Spring IOC 容器有什么不同吗?
Spring Bean容器是Spring框架中用于管理Bean(对象)生命周期的容器,负责创建、配置、装配和管理Bean。
Spring IOC(控制反转)容器是Bean容器的一种实现方式,它通过依赖注入(DI)将对象的创建和依赖关系的管理交给容器,而不是由程序代码主动控制。
区别:
Bean容器是一个广义概念,IOC容器是其具体实现。
IOC容器实现了控制反转思想,是Bean容器的核心机制。
1.2 Spring IOC 如何理解?
IOC(Inversion of Control,控制反转)是一种设计思想,将对象的创建和依赖关系的管理交给容器,而不是由程序主动控制。Spring通过IOC容器实现这一思想,降低了组件之间的耦合度,提高了系统的可维护性和扩展性。
1.3 Spring DI 如何理解?
DI(Dependency Injection,依赖注入)是实现IOC的具体方式。Spring容器在运行期间,动态地将某个对象所需的外部资源(如其他对象、配置值等)注入到该对象中,常见方式有构造器注入、setter注入和注解注入。
1.4 Spring 中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
配置作用域:使用`@Scope`注解,如`@Scope("prototype")`或`@Scope("singleton")`。
配置延迟加载:使用`@Lazy`注解,如`@Lazy(true)`,表示该Bean在第一次使用时才初始化。
1.5 Spring 工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
- 借助反射机制和工厂模式构建Bean对象。
- 释放资源是为了防止内存泄漏。
- 内存泄漏是指程序中已分配的内存由于某种原因未被释放,导致系统可用内存逐渐减少,最终可能导致程序崩溃。
1.6 描述Spring MVC处理流程及应用优势?
处理流程:
1. 用户发送请求至前端控制器DispatcherServlet。
2. DispatcherServlet调用HandlerMapping找到对应Controller。
3. Controller处理请求并返回ModelAndView。
4. DispatcherServlet通过ViewResolver解析视图。
5. 返回渲染后的视图给用户。
优势:
- 松耦合、可扩展性强
- 支持RESTful风格
- 与Spring无缝集成
- 注解驱动开发,简洁高效
1.7 Spring中的事务处理方式及优缺点?
方式:
- 编程式事务:手动控制事务边界,灵活性高,但代码耦合度高。
- 声明式事务:通过注解或XML配置,推荐方式,解耦、简洁。
优缺点:
- 编程式:灵活但复杂。
- 声明式:简洁但灵活性略低。
1.8 MyBatis应用中#与$有什么异同点?
#:预编译处理,防止SQL注入,安全。
$:字符串拼接,直接替换,存在SQL注入风险。
同:都用于参数替换。
异:#安全,$性能略高但风险大
1.9 MyBatis应用动态SQL解决了什么问题?
动态SQL解决了SQL语句拼接复杂、条件判断繁琐的问题,使SQL更灵活、可维护性更强,支持<if>、<choose>、<foreach>等标签。
1.10 Shiro框架权限管理时的认证和授权流程描述?
认证流程: 用户提交身份信息 → SecurityManager → Realm验证 → 登录成功/失败。
授权流程: 用户访问资源 → SecurityManager → Realm获取权限 → 判断是否授权。
1.11 BeanFactory和ApplicationContext有什么区别?
BeanFactory:基础容器,延迟加载,功能简单。
ApplicationContext:高级容器,立即加载,支持AOP、事务、国际化等。
1.12 请解释Spring Bean的生命周期?
1. 实例化Bean
2. 设置属性值
3. 调用BeanNameAware、BeanFactoryAware等接口方法
4. 初始化前处理(BeanPostProcessor)
5. 调用初始化方法(如@PostConstruct)
6. 初始化后处理
7. Bean就绪
8. 销毁前处理
9. 调用销毁方法(如@PreDestroy)
1.13 Spring Bean的作用域之间有什么区别?
singleton:单例,默认作用域。
prototype:每次请求创建新实例。
request:每次HTTP请求创建一个实例(Web环境)。
session:每个Session一个实例(Web环境)。
application:整个ServletContext一个实例(Web环境)。
1.15 使用Spring框架的好处是什么?
解耦、简化开发
支持AOP、事务管理
集成性强(与MyBatis、Hibernate等)
提供丰富的功能模块(MVC、Security、Batch等)
1.16 Spring 中用到了哪些设计模式?
工厂模式(BeanFactory)
单例模式(默认Bean作用域)
代理模式(AOP)
模板方法(JdbcTemplate)
观察者模式(事件机制)
1.17 Spring 如何保证 Controller 并发的安全?
Spring Controller默认是单例的,通过避免使用实例变量或使用线程安全的数据结构(如ThreadLocal)来保证并发安全
1.18 使用Spring框架的好处是什么?
(同1.15)简化开发、解耦、支持AOP、事务、集成性强、模块化设计。
1.19 在Spring中如何注入一个Java集合?
使用注解如@Autowired结合集合类型,如
java
@Autowired
private List<MyBean> beanList;
1.20 Spring支持的事务管理类型?
编程式事务管理
声明式事务管理(推荐)
1.21 Spring框架的事务管理有哪些优点?
简化事务控制
与业务逻辑解耦
支持多种事务策略
支持声明式事务
1.22 Spring MVC的主要组件?
DispatcherServlet(前端控制器)
HandlerMapping(映射处理器)
Controller(控制器)
ModelAndView(模型与视图)
ViewResolver(视图解析器)
1.23 SpringMvc怎么和AJAX相互调用的?
通过@ResponseBody注解返回JSON数据,前端使用AJAX发送请求并接收JSON响应。
1.24 Mybatis 中#和\)的区别?
(同1.8)#预编译安全,\(拼接不安全。
1.25 mybatis的缓存机制,一级,二级介绍一下?
一级缓存:SqlSession级别,默认开启,生命周期短。
二级缓存:Mapper级别,需手动配置,多个SqlSession共享。
1.26 SpringMVC与Struts2的区别?
SpringMVC基于方法,Struts2基于类。
SpringMVC性能更高,集成更好。
Struts2配置复杂,漏洞较多。
1.27 mybatis的基本工作流程?
1. 读取配置文件
2. 创建SqlSessionFactory
3. 打开SqlSession
4. 执行SQL
5. 提交事务
6. 关闭SqlSession
1.28 什么是MyBatis的接口绑定,有什么好处?
接口绑定是指通过接口定义SQL映射,无需实现类。好处是简化开发、提高可维护性、支持动态代理。
1.29 MyBatis的编程步骤?
(同1.27)配置 → 工厂 → 会话 → 执行 → 提交 → 关闭。
1.30 JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
JDBC冗余、手动映射、SQL硬编码。
MyBatis提供自动映射、SQL分离、缓存机制、动态SQL等解决方案。
1.31 MyBatis的优缺点?
优点:
SQL灵活
学习成本低
与Spring集成好
缺点:
SQL需手动编写
数据库迁移成本高
1.33 谈谈你对SpringMVC的理解?
SpringMVC是Spring提供的轻量级Web框架,基于MVC设计模式,结构清晰、注解驱动、与Spring无缝集成,适合构建RESTful服务。
1.34 简述Mybatis的插件运行原理,以及如何编写一个插件?
原理: 基于拦截器链(Interceptor Chain),拦截Executor、ParameterHandler、ResultSetHandler、StatementHandler。
编写: 实现Interceptor接口,使用@Intercepts注解指定拦截点。
1.36 Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
支持。原理是通过动态代理(如CGLIB)在访问关联对象时才执行SQL查询。
1.37 Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
可以。
一对一:使用association标签
一对多:使用collection标签
区别:一对一映射单个对象,一对多映射集合。
1.38 Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
通过ResultMap或自动映射(列名与属性名一致)。支持别名、嵌套映射、自定义转换器等。
1.39 Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
B标签必须定义在A标签前面,否则解析时报错。
1.40 MyBatis里面的动态Sql是怎么设定的?用什么语法?
使用XML标签如<if>、<choose>、<foreach>、<where>等构建动态SQL。
1.41 Mybatis都有哪些Executor执行器?它们之间的区别是什么?
SimpleExecutor:默认,每次执行都新建Statement。
ReuseExecutor:复用Statement。
BatchExecutor:批量执行,适用于批量操作。
1.42 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
MyBatis需手动编写SQL,映射关系需配置,故称半自动。全自动ORM(如Hibernate)无需写SQL,映射全自动。
1.43 简单介绍下你对mybatis的理解?
MyBatis是轻量级持久层框架,SQL与代码分离,支持动态SQL、缓存、插件扩展,适合对SQL有精细控制需求的场景。
1.44 介绍一下Spring的事物管理?
Spring提供声明式和编程式事务管理,支持多种事务传播行为,通过AOP实现与业务解耦,常用@Transactional注解。
1.45 SSM优缺点、使用场景?
优点:
结构清晰
各层解耦
灵活高效
缺点:
配置繁琐
学习成本高
使用场景: 中小型Java Web项目,需灵活控制SQL的场景。
1.46 SpringMVC的工作流程?
(同1.6)DispatcherServlet → HandlerMapping → Controller → ModelAndView → ViewResolver → 响应。
1.47 如果你也用过struts2.简单介绍下springMVC和struts2的区别有哪些?(同1.26)SpringMVC基于方法、性能高、集成好;Struts2基于类、配置复杂、漏洞多。
1.48 怎么样把数据放入Session里面?
在Controller方法参数中添加HttpSession session,然后使用session.setAttribute("key", value)。
1.49 讲下SpringMvc的执行流程?
(同1.6)请求 → DispatcherServlet → 映射 → 控制器 → 模型视图 → 解析 → 响应。
1.50 MyBatis(IBatis)的好处是什么?
SQL灵活、学习成本低、与Spring集成好、支持动态SQL、缓存、插件扩展。
1.51 Bean 工厂和 Application contexts 有什么区别?
(同1.11)BeanFactory功能简单,延迟加载;ApplicationContext功能强大,立即加载,支持AOP、事务等。
1.52 解释Spring支持的几种bean的作用域?
(同1.13)singleton、prototype、request、session、application。
1.53 什么是bean的自动装配?
Spring根据类型或名称自动将依赖的Bean注入到目标Bean中,减少手动配置。
1.54 什么是基于Java的Spring注解配置?给一些注解的例子?
使用注解代替XML配置,如:
@Configuration
@Bean
@ComponentScan
@Autowired
1.55 使用Spring通过什么方式访问Hibernate?
通过LocalSessionFactoryBean配置SessionFactory,使用HibernateTemplate或@Transactional注解访问。
1.56 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
继承HibernateDaoSupport类,注入SessionFactory,即可使用getHibernateTemplate()进行数据库操作。
1.57 Spring框架的事务管理有哪些优点?
解耦、简洁、支持多种事务策略、与AOP结合、声明式事务支持。
1.58 在Spring AOP 中,连接点和切入点的区别是什么?
连接点(Joinpoint):程序执行过程中可插入切面的点,如方法调用。
切入点(Pointcut):匹配连接点的表达式,定义切面在哪些连接点生效。
1.59 AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面、切入点和通知?
作用: 解耦、增强功能(如日志、事务)。
底层: 动态代理(JDK/CGLIB)。
用到: 事务、日志、权限、监控等。
切面: 横切逻辑封装类。
切入点: 匹配连接点的表达式。
通知: 切面在切入点执行的逻辑(前置、后置、环绕等)。
1.60 Spring中@AutoWired和@Resource之间区别是什么?
@Autowired:按类型注入,Spring提供。
@Resource:按名称注入,JDK提供。
都用于依赖注入,但来源和匹配策略不同。
