毕业季--Java框架常见面试题

简介: 毕业季--Java框架常见面试题

mybatis中取值方式有几种?各自的区别是什么?

#{}和${}的区别
1. #{}相当于sql语句的占位符,他的执行效率和安全性都比字符串拼接要好。
2. ${}相当于字符串拼接,更加灵活。可以应用在sql中的关键字。 select * from 表 order by ? 这个场景可以应用在${}上。

mybatis的一级缓存和二级缓存

1. mybatis中默认带了一级缓存,自动就使用了一级缓存。一级缓存是跟sqlSession相关的缓存。当我们使用同样的sqlSession去执行相同的查询sql那么一级缓存就会生效。一级缓存应用场景不多,几乎用不到。
2. mybatis的二级缓存不是默认打开的,需要我们手动设置开启二级缓存。二级缓存是跟SqlSessionFactory相关的缓存。只要是同一个sqlSessionFactory创建的sqlSession对象执行的sql语句都共用这个二级缓存。

谈谈对spring框架的理解。IOC和AOP

IOC的回答要点:
1. 底层原理。工厂模式
2. ioc的解释。
3. ioc的具体应用。如果是配置文件如何管理bean对象,如果是注解,有哪些注解。DI,给属性赋值。
4. ioc的好处
aop的回答要点:
1. 底层原理:代理模式。静态代理和动态代理。
2. aop的解释。面向切面编程。
3. 具体应用。spring中使用aop我们要怎么做。目标类,额外功能类(通知类),切入点,织入。
4. aop的好处。
5. aop的使用场景。性能的检测,事务的控制,日志的记录。

spring常见的注解有哪些?

组件注解:
​  @Controller @Service @Repository @Component @Bean @Configration @Scope
装配注解:
​  @Autowire @Resource @Value
aop注解:
​  @Aspect @Before @After @Pointcut @Transcational
Mvc注解:
​  @RestController @RequetMapping @PathVariable @RequestBody @RequestParam

SpringMVC处理理请求的流程

客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
解析到对应的 Handler(也就是我们平常说的 Controller 控制器)后,开始由 HandlerAdapter 适配器处理。
HandlerAdapter 会根据 Handler来调用真正的处理器开处理请求,并处理相应的业务逻辑。
处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
ViewResolver 会根据逻辑 View 查找实际的 View。
DispaterServlet 把返回的 Model 传给 View(视图渲染)。
把 View 返回给请求者(浏览器)

springboot的starter机制。

在springboot的入口类上面有一个注解@SpringbootApplication,被分解成了三个非常重要的注解。
@SpringBootConfigration(配置类),@EnabledAutoConfigration(跟starter机制相关),@ComponentScanner(扫描当前包以及子包中的所有注解)
starter机制的注解会自动扫描第三方依赖中META-INF,spring.factories配置文件。这个配置文件中有个配置项指向了第三方依赖的配置类@Configration,在这个配置类中,第三方依赖会把要管理的对象都配置成@Bean注解。

spring创建对象的生命周期

 单例对象在spring容器创建的时候就会被创建出来,而多例的对象会在ac.getBean()的时候创建出对象。
spring会对对象的属性进行依赖的注入。
执行BeanPostProcessor的前置处理。
执行InitializingBean接口的初始化方法。
执行bean标签中配置的init-method的初始化方法。
执行BeanPostProcessor的后置处理的方法。
到此整个bean对象创建完毕,我们就使用这个bean对象。
在spring容器要销毁对象的时候,bean会执行销毁操作,先执行DisposableBean接口的销毁方法。
执行配置在bean标签上面的destory-method的方法。

SpringBoot启动过程

a. 通过 SpringFactoriesLoader加载 META-INF/spring.factories文件读取里面的SpringFactoryRunListener配置,获取并创建 SpringApplicationRunListener对象
b. 然后由 SpringApplicationRunListener来发出 starting 消息。
c. 获取执行的命令行参数,并配置当前 SpringBoot 应用将要使用的 Environment,换句话说就是读取springboot项目外部的配置信息,也就是使用@PropertySource注解引入的外部配置。
d. 完成之后,依然由 SpringApplicationRunListener来发出 environmentPrepared 消息
e. 创建 ApplicationContext
f. 初始化 ApplicationContext,并设置 Environment,加载相关配置等
g. 由 SpringApplicationRunListener来发出 contextPrepared消息,告知SpringBoot 应用使用的 ApplicationContext已准备OK
h. 将各种 beans 装载入 ApplicationContext,继续由 SpringApplicationRunListener来发出 contextLoaded 消息,告知SpringBoot 应用使用的 ApplicationContext已装填OK
i. refresh ApplicationContext,完成IoC容器器可用的最后一步,这个过程就是创建出来了容器里面所有的组件。
j. 由 SpringApplicationRunListener来发出 started 消息
k. 完成最终的程序的启动
l. 由 SpringApplicationRunListener来发出 running 消息,告知程序已运行行起来了了

spring如何使用三级缓存解决循环依赖的问题。

当A对象依赖B对象,B对象又依赖A对象这时候就产生了循环依赖的问题。
一级缓存里面放的是spring创建的完整的对象,对象的各个属性都已经有值了。
二级缓存里面放的是spring刚创建的对象,这些对象的属性可能没有值。
三级缓存存放需要spring对象的动态代理的代码。当对象需要动态代理的时候通过三级缓存可以获取到代理对象。


相关文章
|
4天前
|
存储 Java 容器
Java一分钟之-高级集合框架:LinkedList与TreeSet
【5月更文挑战第17天】这篇博客对比了Java集合框架中的LinkedList和TreeSet。LinkedList是双向链表,适合中间插入删除,但遍历效率低且占用空间大;TreeSet基于红黑树,保证元素有序且不重复,插入删除速度较LinkedList慢但查找快。选择时需根据操作需求和性能考虑。
12 2
|
3天前
|
Java 数据库连接 数据库
spring--为web(1),富士康java面试题整理
spring--为web(1),富士康java面试题整理
|
3天前
|
安全 Java 容器
Java一分钟之-高级集合框架:并发集合(Collections.synchronizedXXX)
【5月更文挑战第18天】Java集合框架的`Collections.synchronizedXXX`方法可将普通集合转为线程安全,但使用时需注意常见问题和易错点。错误的同步范围(仅同步单个操作而非迭代)可能导致并发修改异常;错误地同步整个集合类可能引起死锁;并发遍历和修改集合需使用`Iterator`避免`ConcurrentModificationException`。示例代码展示了正确使用同步集合的方法。在复杂并发场景下,推荐使用`java.util.concurrent`包中的并发集合以提高性能。
17 3
|
3天前
|
Java 开发者
Java一分钟之-高级集合框架:优先队列(PriorityQueue)
【5月更文挑战第18天】`PriorityQueue`是Java集合框架中的无界优先队列,基于堆数据结构实现,保证队头元素总是最小。常见操作包括`add(E e)`、`offer(E e)`、`poll()`和`peek()`。元素排序遵循自然排序或自定义`Comparator`。常见问题包括错误的排序逻辑、可变对象排序属性修改和混淆`poll()`与`peek()`。示例展示了自然排序和使用`Comparator`的排序方式。正确理解和使用`PriorityQueue`能提升应用性能。
36 6
|
3天前
|
存储 Java
Java一分钟之-高级集合框架:Queue与Deque接口
【5月更文挑战第18天】本文探讨Java集合框架中的`Queue`和`Deque`接口,两者都是元素序列的数据结构。`Queue`遵循FIFO原则,主要操作有`add/remove/element/peek`,空队列操作会抛出`NoSuchElementException`。`Deque`扩展`Queue`,支持首尾插入删除,同样需注意空`Deque`操作。理解并正确使用这两个接口,结合具体需求选择合适数据结构,能提升代码效率和可维护性。
29 4
|
3天前
|
移动开发 前端开发 JavaScript
Java和web前端,IT新人该如何选择?,2024年最新Web前端内存优化面试
Java和web前端,IT新人该如何选择?,2024年最新Web前端内存优化面试
|
3天前
|
安全 Java 数据库
Spring boot 入门教程-Oauth2,java面试基础题核心
Spring boot 入门教程-Oauth2,java面试基础题核心
|
3天前
|
Java
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
Java中int[]与Integer[]相互转化的方法,java基础知识面试重点总结
|
4天前
|
算法 Java C++
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
刷题两个月,从入门到字节跳动offer丨GitHub标星16k+,美团Java面试题
|
4天前
|
设计模式 算法 Java
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总
Java的前景如何,好不好自学?,万字Java技术类校招面试题汇总