当前位置: 首页 > news >正文

java测试题(下)

1. Spring 核心概念

1.1 如何理解 Spring DI?

DI(依赖注入)IoC(控制反转) 的具体实现方式,由 Spring 容器在运行时通过以下方式自动注入依赖:

  • 构造器注入(推荐)

  • Setter 注入

  • 字段注入(不推荐,因测试困难)

开发者无需手动 new 依赖对象,降低耦合度。


1.2 基于注解配置作用域与延迟加载

注解作用域示例描述
@Scope@Scope("singleton")(默认)单例模式,全局唯一实例
@Scope("prototype")每次请求创建新实例
@Scope(value="request")每个 HTTP 请求一个实例(Web 环境)
@Lazy@Lazy(true)延迟初始化,首次使用时创建 Bean

示例代码

@Component
@Scope("prototype")
@Lazy
public class MyBean { }

1.3 BeanFactory vs ApplicationContext

特性BeanFactoryApplicationContext
加载时机懒加载(调用 getBean() 时)预加载(容器启动时初始化所有单例 Bean)
高级功能支持国际化、事件传播、AOP 等
适用场景资源受限环境(如移动设备)企业级应用(99% 场景使用)

1.4 Spring Bean 生命周期

  1. 实例化:通过反射创建 Bean 实例。

  2. 属性赋值:DI 注入依赖。

  3. 初始化

    • 调用 @PostConstruct 方法

    • 实现 InitializingBeanafterPropertiesSet()

  4. 使用:容器中的 Bean 被调用。

  5. 销毁

    • 调用 @PreDestroy 方法

    • 实现 DisposableBeandestroy()


1.5 Bean 作用域对比

作用域描述适用场景
singleton默认作用域,容器内唯一实例无状态服务(如工具类、DAO)
prototype每次请求创建新实例有状态对象(如用户会话)
request每个 HTTP 请求一个实例(Web 环境)表单数据、请求级缓存
session每个 HTTP Session 一个实例用户登录状态、购物车
application整个 Web 应用共享一个实例(ServletContext)全局配置、缓存

1.6 设计模式应用

模式示例
工厂模式BeanFactory 创建 Bean 实例
单例模式默认作用域 singleton
代理模式AOP 动态代理(JDK/CGLIB)
观察者模式事件监听(ApplicationListener
模板方法模式JdbcTemplateRestTemplate

1.7 Controller 并发安全

  • 无状态设计:避免定义成员变量。

  • 线程安全:所有数据通过方法参数或局部变量传递。

  • 示例

    @RestController
    public class SafeController {// 正确:无成员变量@GetMapping("/test")public String test(@RequestParam String param) {return "Result: " + param;}
    }

2. Spring MVC

2.1 处理流程

  1. DispatcherServlet 接收请求。

  2. HandlerMapping 根据 @RequestMapping 匹配 Controller。

  3. HandlerAdapter 调用 Controller 方法。

  4. Controller 返回 ModelAndView 或 JSON(@ResponseBody)。

  5. ViewResolver 解析视图(如 JSP、Thymeleaf)。

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


2.2 与 AJAX 交互

  • 后端:使用 @RestController + @ResponseBody 返回 JSON。

  • 前端:AJAX 请求示例(jQuery)

    $.get("/api/user/1", function(data) {console.log(data.name);
    });

2.3 与 Struts2 对比

特性Spring MVCStruts2
控制器单例(线程安全)多例(每个请求一个 Action)
配置注解驱动(零 XML)基于 XML 和 OGNL
性能更高(无拦截器栈)较低(复杂 OGNL 解析)
生态与 Spring Boot 无缝集成社区已停滞

3. Spring 事务管理

3.1 两种方式对比

方式优点缺点
声明式零侵入(@Transactional学习 AOP 和配置复杂
编程式精确控制(TransactionTemplate代码冗余、维护困难

3.2 优势

  • 传播行为:支持 REQUIREDREQUIRES_NEW 等 7 种策略。

  • 隔离级别READ_COMMITTEDSERIALIZABLE 等。

  • 多技术兼容:统一 JDBC、JPA、Hibernate 事务。

  • 测试支持:测试时自动回滚(@Rollback)。


4. MyBatis

4.1 动态 SQL 解决的问题

  • SQL 注入#{} 预编译参数(如 #{id})。

  • 代码冗余<if><choose> 等标签动态拼接 SQL。

  • 复杂查询<foreach> 处理 IN 语句。

示例

<select id="findUser" resultType="User">SELECT * FROM user<where><if test="name != null">AND name = #{name}</if></where>
</select>

4.2 缓存机制

类型范围生命周期配置方式
一级缓存SqlSession同一会话内有效,默认开启无需配置
二级缓存Mapper跨 SqlSession,需手动开启<cache/> 或注解 @CacheNamespace

4.3 接口绑定

  • 原理:通过 JDK 动态代理为 Mapper 接口生成实现类。

  • 好处

    • SQL 与 Java 代码分离(XML 或注解)。

    • 无需手动实现 DAO(如 JDBC 模板)。

    • 支持动态 SQL 和结果映射。


4.4 JDBC 不足与 MyBatis 解决

JDBC 问题MyBatis 解决方案
冗余代码封装模板(SqlSessionTemplate
手动事务管理集成 Spring 声明式事务
无连接池集成 HikariCP、Druid
手动 ORM自动结果映射(@Results

4.5 优缺点

优点缺点
SQL 可控性强需手写 SQL
轻量级(无过度封装)二级缓存配置复杂
性能优化友好(如延迟加载)XML 配置繁琐(可用注解)

5. Shiro 权限管理

5.1 认证与授权流程

  1. 认证

    • Subject.login() 提交凭证(如用户名/密码)。

    • Realm.doGetAuthenticationInfo() 验证身份。

    • 成功后将用户信息存入 Session

  2. 授权

    • Realm.doGetAuthorizationInfo() 加载角色和权限。

    • 通过注解 @RequiresRoles("admin") 或标签 <shiro:hasPermission> 校验权限。


6. 其他常见问题

6.1 Bean 工厂底层机制

  • 反射:通过 Class.forName() 实例化 Bean。

  • 工厂模式BeanFactory 管理对象生命周期。

  • 动态代理:AOP 生成代理对象(JDK/CGLIB)。

  • 资源释放:调用 DisposableBean.destroy()@PreDestroy 避免内存泄漏。


6.2 内存泄漏

  • 定义:已分配内存无法被 GC 回收(如未关闭的 ConnectionThreadLocal 未清理)。

  • 预防:使用 try-with-resources、Spring 的 DisposableBean

http://www.dtcms.com/a/300035.html

相关文章:

  • 创意竖状滚动轮播图
  • 嵌入式硬件篇---zigbee无线串口通信问题
  • 【科普】ESP8266 连接 OneNet 平台传输数据与 4G 模块传输数据在多个维度存在显著区别,主要体现在以下几个方面:
  • 802.11系列无线局域网标准详细对比
  • buuctf_一叶障目_just a rar_snack
  • golang实现一个规则引擎,功能包括实时增加、修改、删除规则
  • 基于springboot的图书借阅系统
  • AI Agent开发学习系列 - LangGraph(1): 用LangGraph创建我们的第一个Agent
  • 最终一致性VS顺序一致性VS线性一致性(了解)
  • (六) Spring AI 1.0版本 + 千问大模型+RAG
  • 在python3.8和pytorch1.8.1的基础上安装tensorflow
  • Flink是如何实现物理分区?
  • 深入解析C++原子指针std::atomic
  • GIS地理信息系统建设:高精度3D建模
  • [Linux入门] 初学者入门:Linux DNS 域名解析服务详解
  • Anaconda常用命令及环境管理指南
  • kali [DNS劫持] 实验(详细步骤)
  • Containerd简介
  • 【Ubuntu】发展历程
  • 如何做数据增强?
  • 框架式3D打印机结构设计cad【9张】三维图+设计说明书
  • 【升级U8+】不能将值 NULL 插入列 ‘LocaleID‘,表 ‘hr_sys_function_Base‘;列不允许有 Null 值。
  • flink查看taskManager日志
  • 数组内存学习
  • Django5.1(130)—— 表单 API一(API参考)
  • 【Luogu】每日一题——Day14. P5960 【模板】差分约束 (图论 + 最短路)
  • Nacos-服务注册,服务发现(二)
  • mac版SVN客户端
  • Pythong高级入门Day5
  • npm ERR! cb() never called!