1. 谈谈你对SpringMVC的理解?
答案:
SpringMVC是基于Java的轻量级Web框架,采用MVC架构模式。它通过DispatcherServlet统一处理请求,支持注解驱动、数据绑定、视图解析等功能,简化了Web开发。


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

  • 原理:基于责任链模式,通过拦截器拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler四大对象的方法。

  • 编写插件:实现Interceptor接口,重写intercept方法,并使用@Intercepts注解指定拦截的方法。


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

  • 支持。

  • 原理:通过动态代理,在访问关联对象时才触发SQL查询。


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

  • 能。

  • 方式:嵌套查询(分步查询)、嵌套结果(联表查询)。

  • 区别:嵌套查询支持延迟加载,但会引发N+1问题;嵌套结果一次查询全部数据,效率高但不支持延迟加载。


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

  • 通过ResultMap或自动映射(列名与属性名一致)。

  • 映射形式:字段映射、构造器映射、关联映射、集合映射。


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

  • B标签可以定义在A标签的后面,Mybatis解析时会先完整读取整个文件。


7. MyBatis里面的动态Sql是怎么设定的?用什么语法?
答案:

  • 使用XML标签:<if>、<choose>、<foreach>、<where>、<set>等。

  • 语法:OGNL表达式。


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

  • SimpleExecutor、ReuseExecutor、BatchExecutor。

  • 区别:SimpleExecutor每次执行新Statement;ReuseExecutor复用Statement;BatchExecutor批量执行。


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

  • 半自动:需要手动编写SQL,灵活可控。

  • 全自动(如Hibernate):自动生成SQL,开发效率高但灵活性低。


10. 简单介绍下你对mybatis的理解?
答案:
Mybatis是一款持久层框架,通过XML或注解配置SQL,灵活映射结果到Java对象,支持动态SQL、插件扩展等。


11. 介绍一下Spring的事物管理?
答案:

  • 声明式事务(@Transactional)和编程式事务(TransactionTemplate)。

  • 支持事务传播行为、隔离级别、回滚规则等。


12. SSM优缺点、使用场景?
答案:

  • 优点:轻量、灵活、易于集成。

  • 缺点:配置较多,依赖管理复杂。

  • 适用场景:中小型企业级应用、需要灵活SQL控制的系统。


13. SpringMVC的工作流程?
答案:

  1. 用户请求 → DispatcherServlet

  2. HandlerMapping 查找Handler

  3. HandlerAdapter 执行Controller

  4. 返回ModelAndView

  5. ViewResolver 解析视图

  6. 渲染视图返回响应


14. 如果你也用过struts2,简单介绍下springMVC和struts2的区别有哪些?
答案:

  • SpringMVC基于方法拦截,Struts2基于类拦截。

  • SpringMVC与Spring集成更好,Struts2配置较繁琐。

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


15. 怎么样把数据放入Session里面?
答案:

java

request.getSession().setAttribute("key", value);

16. 讲下SpringMvc的执行流程?
答案:
同第13题。


17. MyBatis(IBatis)的好处是什么?
答案:

  • SQL与代码分离

  • 灵活的动态SQL

  • 易于优化和调试


18. Bean 工厂和 Application contexts 有什么区别?
答案:

  • BeanFactory:基础容器,懒加载。

  • ApplicationContext:扩展容器,支持AOP、事件、国际化等,预加载Bean。


19. 解释Spring支持的几种bean的作用域?
答案:

  • singleton、prototype、request、session、application、websocket


20. 什么是bean的自动装配?
答案:
Spring自动注入依赖,方式包括:byName、byType、constructor、autodetect。


21. 什么是基于Java的Spring注解配置? 给一些注解的例子?
答案:

  • 使用注解代替XML配置。

  • 例如:@Component、@Autowired、@Configuration、@Bean


22. 使用Spring通过什么方式访问Hibernate?
答案:

  • 通过HibernateTemplate或集成Hibernate的SessionFactory。


23. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
答案:

  • 继承HibernateDaoSupport,注入SessionFactory,使用getHibernateTemplate()操作数据。


24. Spring框架的事务管理有哪些优点?
答案:

  • 统一的事务API

  • 声明式事务管理

  • 支持多种事务管理器


25. 在Spring AOP 中,连接点和切入点的区别是什么?
答案:

  • 连接点:程序中可插入切面的点(如方法调用)。

  • 切入点:定义哪些连接点被拦截。


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

  • 作用:解耦横切逻辑(如日志、事务)。

  • 实现:动态代理(JDK/CGLIB)。

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

  • 切面:模块化横切关注点;切入点:匹配连接点;通知:切面执行的动作。


27. Spring中AutoWired和Resource之间区别是什么?
答案:

  • @Autowired:按类型注入,属于Spring。

  • @Resource:按名称注入,属于JSR-250。


28. TCP协议有哪些协议字段?如何保障可靠传输的?滑动窗口解决了什么问题?
答案:

  • 字段:序号、确认号、窗口大小、标志位等。

  • 可靠传输:确认机制、超时重传、流量控制、拥塞控制。

  • 滑动窗口:解决流量控制和效率问题。


29. 什么是三次握手,什么是四次挥手。
答案:

  • 三次握手:建立连接(SYN、SYN-ACK、ACK)。

  • 四次挥手:关闭连接(FIN、ACK、FIN、ACK)。


30. 什么是深拷贝?什么是浅拷贝?
答案:

  • 浅拷贝:复制对象本身,不复制内部对象引用。

  • 深拷贝:复制对象及其所有引用的对象。


31. 访问器如何保障线程安全?举例说明。
答案:

  • 使用synchronized或Lock加锁,或使用原子类。

  • 例如:使用AtomicInteger替代int。


32. 抽象类和接口的不同点和相同点有哪些?
答案:

  • 相同:都不能实例化,都可定义抽象方法。

  • 不同:抽象类可包含实现,单继承;接口可多继承,方法默认public abstract。


33. final关键字能否防止指令重排序?能否代替volatile?
答案:

  • final能保证构造过程中的可见性,但不能完全防止重排序。

  • 不能代替volatile,volatile保证可见性和禁止重排序。


34. Static修饰的模块什么时候开始初始化?
答案:

  • 类加载时初始化(第一次访问类时)。


35. 什么是对象锁,什么是类锁?
答案:

  • 对象锁:锁住对象实例。

  • 类锁:锁住类的Class对象。


36. 进程和线程的区别是什么?进程间的通信方式有哪些?线程间的通信方式有哪些?
答案:

  • 区别:进程独立资源,线程共享进程资源。

  • 进程通信:管道、消息队列、共享内存、Socket。

  • 线程通信:共享变量、等待通知机制、Lock/Condition。


37. 类锁和对象锁是否是互斥的?
答案:

  • 不互斥,分别锁定不同对象。


38. 什么是注解,注解可以作用类的哪些部分?
答案:

  • 注解是元数据,可作用在类、方法、字段、参数、包等。


39. 内部类有哪几种?分别适用于那些场景?
答案:

  • 成员内部类、静态内部类、局部内部类、匿名内部类。

  • 场景:封装、回调、事件监听等。


40. finally的作用,一般用于什么场景?
答案:

  • 无论是否异常都执行,用于资源释放(如关闭流、连接)。


41. 什么是栈溢出?什么是堆溢出?什么是堆外内存?
答案:

  • 栈溢出:递归过深或局部变量过多。

  • 堆溢出:对象过多,GC无法回收。

  • 堆外内存:JVM之外分配的内存(如DirectBuffer)。


42. Java的集合类有哪些?
答案:

  • List:ArrayList、LinkedList

  • Set:HashSet、TreeSet

  • Map:HashMap、TreeMap

  • Queue:LinkedList、PriorityQueue


43. 什么是泛型,请写一个泛型队列或者泛型栈。
答案:

  • 泛型:参数化类型,增强类型安全。

java

public class GenericQueue<T> {
    private LinkedList<T> list = new LinkedList<>();
    public void enqueue(T item) { list.addLast(item); }
    public T dequeue() { return list.pollFirst(); }
}

44. 反射能否获取私有信息,如果能,需要注意什么?
答案:

  • 能,通过setAccessible(true)取消访问检查。

  • 注意:破坏封装性,可能导致安全问题。


45. 线程的状态有哪些?
答案:

  • NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED


46. 线程.start()是进入什么状态?
答案:

  • RUNNABLE


47. 等待队列和阻塞队列的区别是什么?
答案:

  • 等待队列:等待某个条件(如锁)。

  • 阻塞队列:队列满/空时阻塞。


48. sleep()和wait()的区别是什么?
答案:

  • sleep不释放锁,wait释放锁。

  • sleep属于Thread,wait属于Object。


49. sleep(1)什么作用,都用于哪些场景?
答案:

  • 让当前线程暂停1毫秒,用于短暂释放CPU。

  • 场景:模拟延迟、控制执行节奏。


50. 什么是中断机制?举一个中断响应的例子。
答案:

  • 中断机制:通过interrupt()通知线程中断。

  • 示例:

java

thread.interrupt();
if (Thread.interrupted()) {
    // 处理中断
}

51. 守护线程是什么?什么是协程?
答案:

  • 守护线程:服务于用户线程,JVM退出时自动结束。

  • 协程:轻量级线程,用户态调度,适用于高并发IO。


52. 形成死锁的条件是什么?如何避免死锁?
答案:

  • 条件:互斥、请求保持、不可剥夺、循环等待。

  • 避免:按顺序加锁、超时机制、死锁检测。


53. 基本类型的数据存在jvm的哪个区域?
答案:

  • 局部变量存放在栈帧中,成员变量存放在堆中。


54. 多线程的使用场景有哪些?
答案:

  • 并发请求处理、异步任务、定时任务、并行计算。


55. Throw和Throws的区别?
答案:

  • throw:主动抛出异常。

  • throws:声明方法可能抛出的异常。


56. Object类的方法有哪些?分别有什么作用?
答案:

  • equals()、hashCode()、toString()、clone()、wait()、notify()、finalize()等


57. 总线锁的优缺点是什么?
答案:

  • 优点:简单,保证原子性。

  • 缺点:性能低,阻塞其他CPU访问总线。


58. 写三个线程t1、t2、t3,t1线程只输出A,t2线程只输出B,t3线程只输出C,总体输出顺序控制在ABABC...循环模块"ABABC"
答案:

java

// 使用信号量或锁控制顺序,略

59. 默写懒汉式单例模式,以及代码解释
答案:

java

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

60. 推理题:Tomcat如何访问到Controller的,内部实现原理是什么?不低于500字描述
答案:
Tomcat作为Servlet容器,接收到HTTP请求后,将其交给DispatcherServlet处理。DispatcherServlet通过HandlerMapping找到对应的Controller,再由HandlerAdapter执行Controller方法,最后返回ModelAndView,经ViewResolver渲染后返回响应。整个过程基于Java反射和配置文件/注解映射实现。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐