- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
Spring高频面试题及答案
1.说说Spring的核心思想是什么?实际开发中怎么体现的?
答案:Spring核心思想主要是IOC(控制反转)和AOP(面向切面编程)。
IOC简单说就是“把对象创建和管理的权力交给Spring”,比如以前写Service时,要自己newDao对象,现在只要在Dao上加@Repository,Service里用@Autowired注入,Spring会自动帮我们找对应的实现类,改Dao实现时不用动Service,解耦特别明显,比如项目里从MySQL切换到Redis缓存,Dao层改个实现类,Service层完全不用改。
AOP就是“在不修改原代码的情况下,给方法加通用功能”,比如项目里的日志打印、事务控制、异常处理,像我们给Service方法加@Transactional,Spring就会在方法执行前后自动管理事务(开启、提交、回滚),不用在每个方法里写try-catch控制事务,还有打印接口请求日志,写个切面类拦截所有Controller方法,统一记录请求参数和返回值,不用每个接口都写日志代码。
2.SpringBean的生命周期你能说清楚吗?关键步骤有哪些?
答案:Bean的生命周期就是从创建到销毁的全过程,关键步骤大概分这几步:
实例化:Spring通过构造器创建Bean对象(比如调用无参构造);
属性注入:给Bean里@Autowired的属性赋值,比如Service里注入的Dao,这时候才会把Dao对象塞到Service里;
初始化:
先执行BeanPostProcessor的postProcessBeforeInitialization(初始化前处理,比如给Bean加个代理);
再执行自定义初始化方法,比如标了@PostConstruct的方法,或者在XML里配置init-method的方法,项目里常用@PostConstruct做Bean的初始化,比如加载配置文件、初始化连接池;
最后执行BeanPostProcessor的postProcessAfterInitialization(初始化后处理,AOP动态代理就是在这步生成代理对象的);
使用:Bean创建完成后,就可以在其他地方注入使用了;
销毁:容器关闭时,会执行@PreDestroy标注的方法,或者destroy-method配置的方法,比如释放数据库连接、关闭线程池,比如项目里用@PreDestroy关闭Redis的连接池。
3.Spring依赖注入有哪些方式?实际项目中更推荐哪种?为什么?
答案:主要有3种方式:构造器注入、Setter方法注入、字段注入(@Autowired直接标在字段上)。
字段注入最方便,但有缺点:比如不好做单元测试(Mock注入时得用反射),而且可能出现循环依赖没被提前发现;
Setter注入适合“可选依赖”,比如某个Service里的日志组件,有没有都能跑,就用Setter注入,加个@Autowired(required=false);
实际项目里更推荐构造器注入,因为它能强制依赖(必须传的参数在构造器里,少了创建不了Bean),而且Spring默认推荐这种方式,还能避免部分循环依赖问题,比如我们项目里Service层注入Dao,都是用构造器注入,代码里能清楚看到这个Service依赖哪些Bean。
4.Spring事务传播行为有哪些常用的?举个实际场景说明
答案:常用的传播行为主要有4种:
REQUIRED(默认):如果当前有事务,就加入事务;没有就新建一个。比如订单Service的createOrder方法调用库存Service的deductStock方法,两个方法都用默认传播行为,只要createOrder加了@Transactional,deductStock会加入同一个事务,库存扣减失败,订单也会回滚;
REQUIRES_NEW:不管当前有没有事务,都新建一个事务,新事务和原事务独立。比如项目里用户注册成功后要发短信,注册方法加了事务,发短信方法用REQUIRES_NEW,就算注册事务回滚(比如后续保存用户信息失败),短信已经发出去了,不会因为注册回滚而撤销;
SUPPORTS:如果当前有事务就加入,没有就以非事务方式执行。比如查询方法,有时候在事务里调用(比如查订单详情时要关联查库存),就跟着事务走,单独调用时不用事务;
NEVER:不能在事务里执行,否则抛异常。比如某些统计方法,不允许有事务,防止影响统计结果的准确性。
5.@Aut
文档评论(0)