1、什么是自动装配,有哪些方式
spring会自动中上下文中寻找并给bean装配与其相关的属性
自动装配方式
1、byName:把与bean的属性具有相同名字的其他bean自动装配到bean的对应属性中
2、byType:把与bean的属性具有相同类型的其他bean自动装配到bean的对应属性中(若有多个, 则抛出异常)
3、contratc(构造器):把与bean的构造器入参具有相同类型的其他bean自动装配到bean的构造器的对应入参中(查找时通过bean的类型来确定)
4、autodetect:先尝试使用contructor进行自动装配,如果失败再尝试使用byType(不推荐使用)
5、no(默认):不进行自动装配,通过显式设置ref属性来进行装配
2、对象创建的过程
1、类加载检查:检查能否再常量池中定位到这个类的符号引用,并检查是否被加载、解析和初始化,如果没有,先执行类加载过程
2、分配内存:为创建出来的对象分配内存,内存大小在类加载完成后便可确定。分配内存的方式有两种:
1)指针碰撞:内存连续,已分配的和未分配的内存使用指针分割,每次将指针移动一个对象占用的大小
2)空闲列表:内存不连续,用集合存储所有可用内存碎片的地址,每次给对象分配内存时,找一个足够大小的内存碎片来存储
3、初始化:为对象的成员变量和静态变量赋初始值
4、设置对象头:对象分为对象头、对象数据、对齐填充。对象头包括mark word(锁信息、gc分代年龄、hashcode)、class point(类元信息的指针)
5、执行init方法:为对象的变量赋真正的值
3、DCL(双重检查锁)单例模式需不需要volatile
需要。防止因为指令重排序而获取到未初始化完成的对象
4、对象在内存中的布局(对象与数组的不同)
对象:对象头(mark word、class point)、对象数据、对齐填充
数组:对象头(mark word、class point、数组长度)、数据、对齐填充
5、对象头包括什么
mark word(锁信息、gc分代年龄、hashcode值)、class point(类元信息指针)、(数组还包含数组长度)
6、对象怎么定位
句柄访问、直接指针访问
7、对象怎么分配
1、尝试分配到栈中(对象无逃逸),分配到栈中的对象无需GC,随方法结束而销毁
2、无法分配到栈中,如果对象过大,直接分配到堆中的Old区
3、小对象,线程私有本地分配(TLAB)
4、TLAB失败,分配到Young区中的Eden区
5、经过Survivor区的翻转,最后进入Old区
8、一个Object占多少字节
16
9、class实例在方法区还是堆中
在堆中
10、BeanFactory和ApplicationContext的区别
相同:都可以做为Spring的容器,ApplicationContext是BeanFactory的子接口
不同:
1、BeanFactory是延迟加载,ApplicationContext容器启动时就会创建所有bean
2、ApplicationContext提供在监听器中注册bean的事件
3、ApplicationContext支持国际化
4、对于BeanPostProcessor、BeanFactoryPostProcessor,ApplicationContext是自动注册,BeanFactory是手动注册
11、mybatis插件运行原理和开发流程
mybatis四大组件:Executor、StatementHandler、ParameterHandler、ResultSetHandler
mybatis框架对四大组件提供了简单易用的扩展机制,支持使用插件对四大核心组件进行拦截。本质上借助底层的动态代理。
原理:
1)每个创建出来的对象不是直接返回的,而是interceptorChain.pluginAll()
2)获得所有的Interceptor,调用interceptor.plugin()返回target封装后的对象
3)使用插件为目标对象创建代理对象,AOP四大核心组件,然后拦截对象的每一次执行
开发插件:使用@Intercepts注解
12、mybatis的优缺点
优点:
1)简单易学
2)与jdbc相比,减少了大量冗余代码
3)sql与代码分离,降低耦合度
4)可手写sql,较灵活
5)可编写动态sql
6)通过映射标签,支持对象与数据库字段的ORM映射
缺点:
1)sql编写工作量大
2)sql语句依赖数据库,数据库移植性差
13、mybatis和hibernate的区别
1)mybatis易上手
2)mybatis是半自动orm框架,hibernate是全自动orm框架
3)mybatis sql写着xml文件中,较灵活,方便优化
4)hibernate有更完善的缓存和日志机制
5)hibernate数据库移植性好,mybatis较差
14、mybatis中${}和#{}的区别
${}是字符串拼接(statement),会引起sql注入,#{}是占位符(prepareStatement)
15、spring、springMVC、springboot的区别
spring是一个容器,整合各种框架。
springMVC是spring下的专注于web层的框架。
springboot是spring的快速开发包,可简化配置,快速整合其他框架的脚手架
16、springboot自动装配的原理
从@SpringBootApplication注解看起,它由多个注解组成,主要注解包括三个@SpringBootConfiguration、@ComponentScan和@EnableAutoConfiguration
@SpringBootConfiguration注解同样由多个注解组合而成,主要注解为@Configuration,声明此为配置类。
@ComponentScan注解为组件扫描注解,扫描启动类的同级路径及子路径的组件。
@EnableAutoConfiguration注解同样是组合注解,主要包括@AutoConfigurationPackage和@Import两个注解,进入@AutoConfigurationPackage注解,发现导入了一个注册类AutoConfigurationPackages.Registrar.class,将启动类所在包及子包下的所有组件扫描到Spring容器中。回到@EnableAutoConfiguration并进入@Import(AutoConfigurationImportSelector.class),AutoConfigurationImportSelector.class实现了ImportSelector接口并重写了selectImports方法,查找META-INF/spring.factorie文件,并根据文件中的路径加载对应的配置类
17、springMVC的工作流程
1、用户发起请求到前端控制器(DispatcherServlet)
2、前端控制器请求处理器映射器(HandlerMapping)返回执行链
3、将执行链发送给处理器适配器(HandlerAdaptor)
4、交由处理器(Handler)执行后返回ModelAndView对象
5、通过视图解析器(ViewResolver)解析后返回View
6、渲染视图
7、返回给用户
18、spring事务的传播方式
REQUIRED:有事务加入这个事务,没有事务创建新的事务
REQUIRED_NEW:创建新的事务,当前存在事务则将事务挂起
SUPPORTS:使用当前事务,无事务则不使用事务
NOT_SUPPORTS:不使用事务,当前存在事务则挂起
MANDATORY:使用当前事务,不存在则抛异常
NEVER:不使用事务,有事务则抛出异常
NESTED:当前存在事务,则嵌套事务,不存在则创建新的事务
19、spring核心
AOP:面向切面编程的思想,减少重复代码,降低耦合性,提高维护性。
IOC:控制翻转,将对象交由spring容器创建
DI:依赖注入,创建对象时自动设置所需要的值
20、springMVC的九大内置组件
HandlerMapping:处理器映射器
HandlerAdapter:处理器适配器
HandlerExceptionResolver:异常处理器
ViewResolver:视图解析器
LocaleResolver:当前环境处理器(国际化)
ThemeResolver:主题处理器
RequestToViewNameTranslator:视图名称翻译器
MultipartResolver:文件处理器
FlashMapManager:参数传递处理器(重定向中传递参数)
21、spring单例bean是否线程安全
spring框架并没有对bean进行多线程的封装处理,如果单例bean是无状态的,则不存在线程安全问题,如果是有状态的,则是线程不安全的。
标签:面试题,Java,对象,spring,事务,bean,mybatis,注解 From: https://www.cnblogs.com/heavenplus/p/16841840.html