SSM框架

简介: 本内容整理了Spring框架与MyBatis常见面试题,涵盖单例Bean线程安全、AOP、事务管理、Bean生命周期、循环依赖、SpringMVC流程、Spring Boot自动配置、注解使用及MyBatis执行流程与缓存机制,适用于Java开发者面试准备。
  1. Spring框架中的单例bean是线程安全的吗?

候选人

不是线程安全的。当多用户同时请求一个服务时,容器会给每个请求分配一个线程,这些线程会并发执行业务逻辑。如果处理逻辑中包含对单例状态的修改,比如修改单例的成员属性,就必须考虑线程同步问题。Spring框架本身并不对单例bean进行线程安全封装,线程安全和并发问题需要开发者自行处理。

通常在项目中使用的Spring bean是不可变状态(如Service类和DAO类),因此在某种程度上可以说Spring的单例bean是线程安全的。如果bean有多种状态(如ViewModel对象),就需要自行保证线程安全。最简单的解决办法是将单例bean的作用域由“singleton”变更为“prototype”。


  1. 什么是AOP?

候选人

AOP,即面向切面编程,在Spring中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来,实现公共模块复用,降低耦合。常见的应用场景包括公共日志保存和事务处理。


  1. 你们项目中有没有使用到AOP?

候选人

我们之前在后台管理系统中使用AOP来记录系统操作日志。主要思路是使用AOP的环绕通知和切点表达式,找到需要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,例如类信息、方法信息、注解、请求方式等,并将这些参数保存到数据库。


  1. Spring中的事务是如何实现的?

候选人

Spring实现事务的本质是利用AOP完成的。它对方法前后进行拦截,在执行方法前开启事务,在执行完目标方法后根据执行情况提交或回滚事务。


  1. Spring中事务失效的场景有哪些?

候选人

在项目中,我遇到过几种导致事务失效的场景:

  1. 如果方法内部捕获并处理了异常,没有将异常抛出,会导致事务失效。因此,处理异常后应该确保异常能够被抛出。
  2. 如果方法抛出检查型异常(checked exception),并且没有在@Transactional注解上配置rollbackFor属性为Exception,那么异常发生时事务可能不会回滚。
  3. 如果事务注解的方法不是公开(public)修饰的,也可能导致事务失效。


  1. Spring的bean的生命周期?

候选人

Spring中bean的生命周期包括以下步骤:

  1. 通过BeanDefinition获取bean的定义信息。
  2. 调用构造函数实例化bean。
  3. 进行bean的依赖注入,例如通过setter方法或@Autowired注解。
  4. 处理实现了Aware接口的bean。
  5. 执行BeanPostProcessor的前置处理器。
  6. 调用初始化方法,如实现了InitializingBean接口或自定义的init-method
  7. 执行BeanPostProcessor的后置处理器,可能在这里产生代理对象。
  8. 最后是销毁bean。


  1. Spring中的循环引用?

候选人

循环依赖发生在两个或两个以上的bean互相持有对方,形成闭环。Spring框架允许循环依赖存在,并通过三级缓存解决大部分循环依赖问题:

  1. 一级缓存:单例池,缓存已完成初始化的bean对象。
  2. 二级缓存:缓存尚未完成生命周期的早期bean对象。
  3. 三级缓存:缓存ObjectFactory,用于创建bean对象。


  1. 那具体解决流程清楚吗?

候选人

解决循环依赖的流程如下:

  1. 实例化A对象,并创建ObjectFactory存入三级缓存。
  2. A在初始化时需要B对象,开始B的创建逻辑。
  3. B实例化完成,也创建ObjectFactory存入三级缓存。
  4. B需要注入A,通过三级缓存获取ObjectFactory生成A对象,存入二级缓存。
  5. B通过二级缓存获得A对象后,B创建成功,存入一级缓存。
  6. A对象初始化时,由于B已创建完成,可以直接注入B,A创建成功存入一级缓存。
  7. 清除二级缓存中的临时对象A。


  1. 构造方法出现了循环依赖怎么解决?

候选人

由于构造函数是bean生命周期中最先执行的,Spring框架无法解决构造方法的循环依赖问题。可以使用@Lazy懒加载注解,延迟bean的创建直到实际需要时。


  1. SpringMVC的执行流程?

候选人

SpringMVC的执行流程包括以下步骤:

  1. 用户发送请求到前端控制器DispatcherServlet
  2. DispatcherServlet调用HandlerMapping找到具体处理器。
  3. HandlerMapping返回处理器对象及拦截器(如果有)给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter
  5. HandlerAdapter适配并调用具体处理器(Controller)。
  6. Controller执行并返回ModelAndView对象。
  7. HandlerAdapterModelAndView返回给DispatcherServlet
  8. DispatcherServlet传给ViewResolver进行视图解析。
  9. ViewResolver返回具体视图给DispatcherServlet
  10. DispatcherServlet渲染视图并响应用户。


  1. Springboot自动配置原理?

候选人

Spring Boot的自动配置原理基于@SpringBootApplication注解,它封装了@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan@EnableAutoConfiguration是核心,它通过@Import导入配置选择器,读取META-INF/spring.factories文件中的类名,根据条件注解决定是否将配置类中的Bean导入到Spring容器中。


  1. Spring 的常见注解有哪些?

候选人

Spring的常见注解包括:

  1. 声明Bean的注解:@Component@Service@Repository@Controller
  2. 依赖注入相关注解:@Autowired@Qualifier@Resource
  3. 设置作用域的注解:@Scope
  4. 配置相关注解:@Configuration@ComponentScan@Bean
  5. AOP相关注解:@Aspect@Before@After@Around@Pointcut


  1. SpringMVC常见的注解有哪些?

候选人

SpringMVC的常见注解有:

  • @RequestMapping:映射请求路径。
  • @RequestBody:接收HTTP请求的JSON数据。
  • @RequestParam:指定请求参数名称。
  • @PathVariable:从请求路径中获取参数。
  • @ResponseBody:将Controller方法返回的对象转化为JSON。
  • @RequestHeader:获取请求头数据。
  • @PostMapping@GetMapping等。


  1. Springboot常见注解有哪些?

候选人

Spring Boot的常见注解包括:

  • @SpringBootApplication:由@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan组成。
  • 其他注解如@RestController@GetMapping@PostMapping等,用于简化Spring MVC的配置。


  1. MyBatis执行流程?

候选人

MyBatis的执行流程如下:

  1. 读取MyBatis配置文件mybatis-config.xml
  2. 构造会话工厂SqlSessionFactory
  3. 会话工厂创建SqlSession对象。
  4. 操作数据库的接口,Executor执行器。
  5. Executor执行方法中的MappedStatement参数。
  6. 输入参数映射。
  7. 输出结果映射。


  1. Mybatis是否支持延迟加载?

候选人

MyBatis支持延迟加载,即在需要用到数据时才加载。可以通过配置文件中的lazyLoadingEnabled配置启用或禁用延迟加载。


  1. 延迟加载的底层原理知道吗?

候选人

延迟加载的底层原理主要使用CGLIB动态代理实现:

  1. 使用CGLIB创建目标对象的代理对象。
  2. 调用目标方法时,如果发现是null值,则执行SQL查询。
  3. 获取数据后,设置属性值并继续查询目标方法。


  1. Mybatis的一级、二级缓存用过吗?

候选人

MyBatis的一级缓存是基于PerpetualCache的HashMap本地缓存,作用域为Session,默认开启。二级缓存需要单独开启,作用域为Namespace或mapper,默认也是采用PerpetualCache,HashMap存储。


  1. Mybatis的二级缓存什么时候会清理缓存中的数据?

候选人

当作用域(一级缓存Session/二级缓存Namespaces)进行了新增、修改、删除操作后,默认该作用域下所有select中的缓存将被清空。


目录
相关文章
|
2月前
|
负载均衡 算法 Java
微服务篇
本内容整理了Spring Cloud微服务架构中的核心组件、服务注册与发现机制、负载均衡策略、服务容错、限流算法、分布式事务及接口幂等性设计等关键技术点,并结合Nacos、Sentinel、Seata等中间件进行实际应用解析。
205 0
|
2月前
|
SQL Apache Windows
Windows服务器80端口被占用的全面解决方案
在服务管理器中启动apache2服务,即可正常使用80端口。若系统中还安装了其他微软产品如sql等,也可尝试停止其服务进行测试,但请注意,SQL通常不会使用80端口,因此一般不会受到影响。以上就是关于80端口被system占用的详细解决方法,希望对你有所帮助。
|
2月前
|
人工智能 JSON Java
Spring Boot 如何接收并处理不确定类型的请求参数?
在 Spring Boot 中,当需要处理结构不确定的 JSON 数据时,可以使用 `Map` 类型灵活接收键值对数据。对于更复杂的场景,可通过 Jackson 注解支持多态类型、自定义反序列化器,或在接收后动态解析 JSON 数据,提升处理灵活性和扩展性。
|
2月前
|
消息中间件 JSON 监控
痛点:数据量太大怎么办?用API分页查询+增量解决
在处理大数据量API同步时,采用分页查询与增量更新策略可有效避免性能瓶颈与服务限流,提升同步效率与稳定性。本文详解四种分页方式(页码、游标、时间戳、ID分页)与三种增量机制(时间戳、版本号、日志订阅),并提供组合策略与优化技巧,助你高效完成数据同步。
|
2月前
|
运维 Prometheus 监控
系统崩了怪运维?别闹了,你该问问有没有自动化!
系统崩了怪运维?别闹了,你该问问有没有自动化!
103 9
|
2月前
|
算法 NoSQL Java
票据系统全流程解析:业务与技术实现
本项目为电子票据系统,基于微服务架构实现票据全生命周期管理,涵盖出票、背书、贴现、质押、到期兑付等核心业务流程。系统对接上海票据交易所,采用国密算法加密传输,保障交易安全。技术上使用Seata解决分布式事务一致性,通过RabbitMQ和线程池提升高并发处理能力,结合Redis实现分布式锁与数据缓存,提升系统性能与可靠性。
105 0
票据系统全流程解析:业务与技术实现
|
2月前
|
消息中间件 NoSQL Redis
水镜 OMS 系统:全渠道电商中台的设计与实现
水镜OMS是全渠道电商中台,整合线上线下资源,统一管理订单、库存与营销。支持天猫、京东等10+平台接入,通过订单路由与库存共享,实现高效订单处理。系统采用SpringCloud Alibaba架构,结合Redis、Kafka、分库分表等技术,保障高并发下稳定运行,日均订单量超10万,峰值达5000TPS,助力企业提升运营效率与数字化能力。
114 0
|
2月前
|
缓存 人工智能 监控
1688 平台商品详情接口技术揭秘:架构演进与实战优化
本文深入解析了1688商品详情接口的技术架构与核心实现,涵盖微服务拆分、多级缓存、数据聚合及高可用策略,展示了如何构建高性能电商接口系统,并展望AI技术在商品展示中的应用。
|
2月前
|
NoSQL 算法 数据库
旅游项目
本项目涵盖酒店预订、支付系统、短信平台、风控审核、权限管理、推荐系统等多个模块。采用微服务架构,结合Redis、RabbitMQ、ES、MongoDB等技术,实现高并发场景下的稳定服务。支持短信防刷、订单超时取消、优惠券发放、分布式锁控制、Drools规则引擎、拼音搜索、数据分片、权限控制、红包抢夺算法及个性化推荐等功能,保障系统安全性与用户体验。
64 0
|
2月前
|
消息中间件 存储 NoSQL
消息中间件篇
本内容总结了RabbitMQ与Kafka在消息队列中的常见问题及解决方案,涵盖消息不丢失、不重复消费、顺序性、高可用、性能优化等方面,适用于面试或技术选型参考。
78 0