毕业季--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处理理请求的流程

毕业季--Java框架常见面试题_第1张图片

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

springboot的starter机制。

在springboot的入口类上面有一个注解@SpringbootApplication,被分解成了三个非常重要的注解。

@SpringBootConfigration(配置类),@EnabledAutoConfigration(跟starter机制相关),@ComponentScanner(扫描当前包以及子包中的所有注解)

starter机制的注解会自动扫描第三方依赖中META-INF,spring.factories配置文件。这个配置文件中有个配置项指向了第三方依赖的配置类@Configration,在这个配置类中,第三方依赖会把要管理的对象都配置成@Bean注解。

spring创建对象的生命周期

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

SpringBoot启动过程

毕业季--Java框架常见面试题_第2张图片

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对象的动态代理的代码。当对象需要动态代理的时候通过三级缓存可以获取到代理对象。

你可能感兴趣的:(面试,java,mybatis,开发语言,Java面试题,框架面试题)