大家好,感谢邀请,今天来为大家分享一下springboot面试常问的问题,以及和java面试中经常被问到的问题的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
SpringBoot中,@Autowired和@Resource使用起来到底有什么区别
这个问题也有一段时间了,当初也就随手一写,直到最近还有网友在看,为了保证大家看的时候不会出现理解方面的问题,于2021-5-10编辑一次,希望能更加严谨一点,至少不会误导大家。
首先,这个问题有点不准确,这2个注解是使用Spring框架过程中常用的注解,而SpringMVC和SpringBoot等框架都是基于Spring的进阶框架,并没有对这2个注解的使用进行修改或者调整,所以,只讨论Spring框架如何处理这2个注解即可,而不是讨论在SpringBoot中的使用区别。
【结论】在绝大部分情况下,使用这2个注解的任何一个都可以实现自动装配,在使用方面是无感的。
如果要讨论区别,基本上就是2点:
所属不同:@Resource注解是javax包的;@Autowired是Spring声明的;装配机制不同:@Resource会优先byName来装配,即使名称不匹配,也会尝试byType来装配;@Autowired则是先查找匹配类型对象的数量,如果有且仅有1个,则直接装配,如果为0个,则无法装配,此时需要考虑该注解的required属性,默认是true,就会因为“必须装配却没有匹配类型的对象”而抛出异常,如果显式的设置为false,则不装配,保持被自动装配的属性为null值,如果匹配类型的对象超过1个,则会尝试byName,如果成功,则装配,如果失败,则抛出异常。如果一定要说还有其它区别,可以是:
作用范围不同:@Resource用于对字段、Setter方法进行注解,@Autowired可用于构造方法、Setter方法和字段;当同一种类型的对象有多个时(例如声明的类型是接口,在Spring容器中有2个或多个实现类的对象),需要指定名称,@Resource可直接配置name属性来指定bean-name,而@Autowired需要配合@Qualifer注解,由@Qualifer注解来指定bean-name,当用于字段时,直接在字段的声明之前使用这2个注解,当用于Setter方法时,在方法的声明之前使用@Autowired,在方法的参数之前使用@Qualifer;另外,还有很多关于使用@Autowired的细节问题,例如“是不是不建议使用了”、“到底应该怎么用”等等,所以,接下来主要讨论这些问题。
关于“是不是不建议使用了”,这种问题的主要原因应该是最近几年IntelliJIDEA越来越流行了,而许多版本的IntelliJIDEA对@Autowired的预判是有问题的!也就是说:IntelliJIDEA会在编码期实时预判是否存在可以装配的对象,如果它认为没有,就会报错,事实上,它的判断并不完全准确!
例如,尝试在Service组件中装配一个Mapper接口类型的字段时:
(截图来自IntelliJIDEA2020.1.4)
以上报错就是IntelliJIDEA预判错误导致的,如果使用的是Eclipse就不会有这样的问题,解决方案可以是:
在UserMapper接口上添加@Repository注解;将以上代码中的@Autowired配置为@Autowired(required=false),因为@Autowired默认是required=true,同时IntelliJIDEA认为没有可装配对象,所以报错,显式的配置为required=false之后,即使IntelliJIDEA认为没有可装配对象也不会报错了;将以上代码中的@Autowired改为@Resource。再例如在使用SpringSecurity进行配置时也会有类似的问题,只不过这次它认为“存在多个匹配类型的对象”:
(截图来自IntelliJIDEA2020.1.4)
解决以上报错信息的方式可以是:
将声明的UserDetailsService接口类型改为你的UserDetailsServiceImpl实现类类型,例如privateUserDetailsServerImplservice;即可;将以上代码中的@Autowired改为@Resource。由于许多类似问题都可以通过“将@Autowired改为@Resource”来解决,加上一些相关说法(详见下文),且某些片面的断章取义,导致网上还存在“使用@Resource取代@Autowired”、“以后不要再用@Autowired”的说法,而这些说法都是错误的,没有任何官方(开发工具的IntelliJIDEA,或框架官方Spring)说过这样的话!
首先,使用Spring实现自动装配时,有3种方式:
通过构造方法注入;通过Setter注入(即与字段属性匹配的set方法);通过字段注入;基本示例参见下图:
以上图片来自Spring官方提供的资料,可以看到最后还附了个URL,是国外网友写的一篇主题为《whyfieldinjectionisevil》的讨论文章,有兴趣且有一定英语阅读能力的朋友可以自行上网查看全文,大意是“使用字段注入时可能导致NPE”!为什么会这样呢?假设你有如下代码:
如果你因为某种原因直接创建对象,即通过UserServiceservice=newUserService();来创建对象,其中的userRepository属性肯定是没有值的,后续使用这个service对象时,只要涉及调用userRepository就会出现NPE了!
既然UserService是一个组件,为什么还会直接创建对象呢?其实这也算是一个低概率的特殊情况,在彼此不太熟悉的协同工作中可能出现,例如你和我一起开发项目,我对你写的那部分代码不太了解……再就是测试使用时,也可能出现直接创建对象的情况……
如果将代码改为下面这样:
则刚才的问题就不存在了!因为现在的构造方法是需要参数的,你不给参数,就创建不了对象!如果能创建出对象,就肯定给了参数,则userRepository肯定有值,就不会出现NPE!当然,如果你一定要传个null进去就没办法了,Nozuonodiewhyyoutry?
所以,使用构造方法传递参数是一种强制依赖的做法,可以保证不会出现NPE,但是,如果参数太多会不会很奇怪?真的有必要把代码写得这么滴水不漏吗?这个就看你自己了!首先,是IntelliJIDEA并不建议你使用字段注入:
(截图来自IntelliJIDEA2020.1.4)
而Spring的观点,可参见下图:
可以看到,Spring是无所谓的,反正都能用(Springdoesn'tcare,canuseeither),当然,也列举了使用构造方法注入和使用Setter注入的区别(虽然我在前面都是写的字段注入,在NPE问题上,字段注入和Setter注入是一样的)。
既然Spring都无所谓了,我们为什么还要纠结注入方式呢?还是那句话,只要你能保证不出错,怎么都行!可能95%以上的Java从业者不是在写大厂的大型项目,合格的程序员也不会乱写代码,由Setter或字段注入导致NPE的概率本来就极低,不一定需要为了“保证极端情况下也不出错”而刻意的把代码调整为构造方法注入,只要注意规避这个问题即可!
另外,我在上面的代码演示中,在构造方法上加了@Autowired注解,在这里解释一下:
如果类中只存在默认构造方法(无论是你显式的添加的,还是根本不写,由编译器添加的),则无需@Autowired注解,Spring会自动调用,当然,加了也不会出错;如果类中只存在唯一的构造方法,Spring会自动调用,且会自动从Spring容器中找对象装配为调用构造方法的参数,这种情况也是不需要添加@Autowired注解的,加了也不会出错;如果类中存在多个构造方法,且都没有添加@Autowired注解时,当存在无参数构造方法时,Spring会自动调用无参数构造方法,如果你想要Spring调用另外某一个构造方法,就在那个构造方法上添加@Autowired注解;如果类中存在多个构造方法,且超过1个构造方法上都添加了@Autowired注解……你别作,你不需要知道Spring怎么处理,你只要把@Autowired删得只有1个了,就肯定没问题!所以,从道理上来说,应该推荐显式的为某1个构造方法添加@Autowired注解,哪怕是不需要添加也能用,因为这样会保证多构造方法的情况下代码更加直观,增加代码的可读性,但是,从实际工作出发,可能就变成了“有啥好加的?这点道理都不懂还上什么班?”……大家都懒得加了,所以,又不是什么很难懂的原理,加不加就自行把握吧。
最后,再总结一下使用原则:
@Autowired和@Resource在使用时可以不纠结它们的区别,使用它们的目的就是为了装配对象,只要能装得上,装的是对的,无所谓使用哪个?一定要区分选取,先保证“在同一个项目中使用同一个”,不要一个类使用@Autowired,另一个类又使用@Resource,然后,我个人建议使用@Autowired,原因嘛,很简单,你既然用Spring框架,就用它带的注解呗;关于@Autowired的使用方式,不怕麻烦就都使用构造方法注入,且显式的添加@Autowired,如果怕麻烦,只要不出错,就随意吧。Spring官方也考虑到了网友关于@Resource或相关注解的问题,因为没什么需要特别解释的了,就直接贴图好了,大家自行查阅,以下图片仍是来自Spring官方资料:
最后,近期因为工作的关系看了不少Spring的官方资料,包括官方的Spring学习教程,有些感慨,给我的感觉,Spring对外提倡实用主义,极少和你讲理论,源码什么的更是少得可怜,这也和面向对象的思想保持一致,人家都帮你做好了,你好好用就行了,不必关心实现细节,希望大家也能这样!现在IT行业真的被一些大厂带节奏了,网上各种吸引眼球的XX源码解析、XX底层原理、XX加载过程分析、XX算法、大厂案例、大厂面试题……很多时候真的想喷一句“你咋不从操作系统开始做软件研发呢”……真的,绝大部分Java从业者一辈子都进不了大厂,也接触不到超过20台以上服务器才能扛得住的项目,除非是为了应付面试,你甚至不需要知道i++和++i的区别,如果只是自己写代码自己用,你也不需要知道private和public的区别……如果你只想开自己的私家车,不想修车也不想造车,除了吹牛,你都不需要知道发动机的型号……多掌握实用技术,多积累解决问题的经验,原理什么的能不管就不要管,当熟练到一定程度后,再考虑要不要深入了解原理。
好了,就这么多,如果有错别字,大家将就一下吧(可编辑次数有限),如果有觉得不对的地方,欢迎留言讨论。
如何学习spring是先学习设计模式还是spring
看见上一位答主的可爱回答想笑。题主问这个问题应该是还没接触了解过spring框架,我有下面的学习建议:
spring框架和设计模式是两大学习点spring框架包含了许多架构的顶级设计思路,去研究它是需要花费比较多经历的。而设计模式也是一大课题,有专门一本厚厚的设计模式的书籍给你学习。因此,这两种东西不能说先去学谁,应该是用到哪个学哪个。
有人说设计模式是为了弥补Java的不足,这是有一定道理的,常规的二十三种设计模式如果说你要全部理清还算要一点时间,要说能学精通还真的挺难。
spring框架的学习建议:先学习搭ssm框架项目感受spring框架的魅力。对spring框架原理进行理解,这里如果牵扯上了什么设计模式就去学习对应的设计模式。看看能不能理解和基本运用依赖注入和面向切面编程了。推荐读《spring源码深度解析》,系统性得结合源码学习spring框架,途中一定会遇到的设计模式,遇到哪种模式就学哪种模式。归纳一下就是两种并行学习,设计模式是辅助spring框架的理解。
觉得“热心哥哥宇文笑”解读专业的点点关注,会带来更多精彩内容分享java面试题有哪些
肝了一个月的面试题终于来啦,大家开心不。
2020年最新Java面试题整理,全网最全一份,包含各个技术栈,Java基础,Java集合,多线程,Java异常,spring,springMVC,springboot,springcloud,netty,dubbo,activemq,Javaweb,jvm,kafka,MongoDB,mybatis,MySQL,Nginx,rabbitmq,Redis,Tomcat,zookeeper,设计模式,数据结构,算法,分布式,限流,降级,cap原理等等知识点
话不多说,直接上图
总共80多个PDF
【BAT必备】计算机网络面试题:
链接:https://pan.baidu.com/s/1hFggmtdL1ZmE4utBlo8S1g提取码:qfkh
【BAT必备】设计模式面试题
链接:https://pan.baidu.com/s/1eXJveIVvQe-m3MdvLcT-fQ提取码:j0kx
【BAT必备】数据结构算法面试题:
链接:https://pan.baidu.com/s/1daFN9jY03fXsqwc9LeKi2w提取码:5ab7
【BAT必备】多线程面试题:
链接:https://pan.baidu.com/s/1GdvsNESoHPBjWKN2h-iK7Q提取码:cqib
【BAT必备】并发编程锁面试题:
链接:https://pan.baidu.com/s/1hXPPtMY2dvz-g7QcSTc3PA提取码:zhmy
【BAT必备】tomcat面试题:
链接:https://pan.baidu.com/s/1qPZXx4lmLynmaF0XjRTzpQ提取码:5m16
【BAT必备】zookeeper面试题:
链接:https://pan.baidu.com/s/1EhOee9e1Qe-Q6RC8KlthxA提取码:p2am
【BAT必备】spring全家桶面试题:
链接:https://pan.baidu.com/s/1DXGO-N5P6QIGKLZ8LIVOuQ提取码:m9v7
【BAT必备】rocketMq面试题:
链接:https://pan.baidu.com/s/1TEF3yUR4OOaIpj-4ud_79A提取码:3g3d
【BAT必备】redis面试题:
链接:https://pan.baidu.com/s/1qlanxWBfwvKUObnHulCQiA提取码:rjo7
【BAT必备】rabbitMq面试题:
链接:https://pan.baidu.com/s/1ywLiq3IUJVyZosPLNrmyTA提取码:0td4
【BAT必备】netty面试题:
链接:https://pan.baidu.com/s/1Pbv4aelqOt1dUPA2SwEB_Q提取码:2w1e
【BAT必备】Nginx面试题:
链接:https://pan.baidu.com/s/1r8YNyOz0N6MJ9F0045lEZw提取码:49tl
【BAT必备】MySQL面试题:
链接:https://pan.baidu.com/s/1GeX6Fs4nNi6fTUHKxJ2SZw提取码:8pow
【BAT必备】mybatis面试题:
链接:https://pan.baidu.com/s/1xOYiaiQ2JpPt2jb6GdWjaA提取码:aqd3
【BAT必备】MongoDB面试题:
链接:https://pan.baidu.com/s/1QTVx1TF8tDn6LUJr7wdfOQ提取码:j1qt
【BAT必备】Linux面试题:
链接:https://pan.baidu.com/s/1veZ3dBJmz1PduCE5tl-e1A提取码:txpf
【BAT必备】kafka面试题:
链接:https://pan.baidu.com/s/1SWhiBCswleYGsDupSGzE6g提取码:o1gv
【BAT必备】jvm面试题:
链接:https://pan.baidu.com/s/1xi-QLq_I75kha439EGqELw提取码:kxde
【BAT必备】javaweb面试题:
链接:https://pan.baidu.com/s/1r3Bupn9qhJbw5ebR_6h94A提取码:qba4
【BAT必备】Java基础面试题:
链接:https://pan.baidu.com/s/1J40nYKIoV_VMCumoRpIyhQ提取码:5xo7
【BAT必备】dubbo面试题:
链接:https://pan.baidu.com/s/10flnh7Tb0Oxd3yZPQOnjsA提取码:5gc9
【BAT必备】activeMQ面试题:
链接:https://pan.baidu.com/s/1igNB64dpMCjCQkRzvqCXpQ提取码:006a
【BAT必备】分布式相关面试题大全面试题:
链接:https://pan.baidu.com/s/1ZcpJDh07B2NPAL4_4VC6jQ提取码:w4mw
【BAT必备】java面试题大全:
链接:https://pan.baidu.com/s/11jw0Ua4CZiI8-S6EadM_iQ提取码:epmp
【BAT必备】Java面试汇总
链接:https://pan.baidu.com/s/1vG9_cNoiYBW5TY32S4wGnQ提取码:k087
【BAT必备】2020年多家公司整理的350道Java面试题手册
链接:https://pan.baidu.com/s/1FEGQVTgiyKG0kCasYn-n2g提取码:f7y1
【BAT必备】Java全部核心知识点整理
链接:https://pan.baidu.com/s/1StG-ib70TDAE1Hb4NVLQRQ提取码:5rp1
整理这些非常辛苦,大家点个赞在走吧你在java面试中被问过什么让你觉得对方逼格很高的问题
分享一位牛友(★霸道可爱的?小盼子)的去哪儿java面经,体验一下什么叫做B格……
以下正文:废话不多说,前几天参加去哪网面试,面经如下:
去哪网java实习生面总共分为四轮(我也不知道为什么这么多)。
一面(技术面)
1.自我介绍,并分析简历上的项目,并发情况,数据量大的情况你怎么办
2.分析悲观锁和乐观锁
3.数据库索引(btree,b+tree)
4.出题建表,写sql,mybatis标签拆分判断。
5.hashmap详细说明,底层数据结构。
6.concurrenthashmap详细说明。
7.treeset(画红黑树)
8.线程常见状况。
9.maven生命周期。
10.linux常用命令。
二面(技术面)
1.各种排序以及应用场景(快排,归并,堆排,选择排)。
2.给你10亿个数,选择10个最小的,最优算法。
3.时间复杂度,空间复杂度。
4.线程池,callable,ExecutorService源码,参数含义。
5.Springmvc的DispatcherServlet源码,工作机制。
6.Springboot工作机制
7.简单说下redis。
8.服务器集群。
9.数据库事务,事务隔离级别
10.git常用命令,是否用过github。
三面(技术面)
1.最近在学什么。
2.如果学习一个新框架
3.设计一块缓存的数据结构,实现快速增加,删除,查找等操作,并判断时间空间复杂度。
4.项目并发如何解决。
四面(hr面)
简单的聊一下薪资待遇。
说了一件大学难忘的事。
发offer。
现阶段能想起来的就这么多,以后再补充,大家加油。
——————————
牛客网(www.nowcoder.com)
-专业IT笔试面试备考平台
-最全C++JAVA前端等互联网技术求职题库
-全面提升IT编程能力
-程序员交友圣地
如何快速上手Spring boot
推荐以SpringBoot教程与SpringCloud教程的详细开源项目“SpringBoot-Learning”此项目内容为SpringBoot教程程序样例,对于SpringBoot的初学者来说非常有用,文末也列出了Spring相关开源项目,供大家交流学习。
1.SpringBoot-Learning部分样例:
快速入门
chapter1:基本项目构建(可作为工程脚手架),引入web模块,完成一个简单的RESTfulAPI使用Intellij中的SpringInitializr来快速构建SpringBoot/Cloud工程工程配置
chapter2-1-1:配置文件详解:自定义属性、随机数、多环境配置等Web开发
chapter3-1-1:构建一个较为复杂的RESTfulAPI以及单元测试chapter3-1-2:使用Thymeleaf模板引擎渲染web视图chapter3-1-3:使用Freemarker模板引擎渲染web视图chapter3-1-4:使用Velocity模板引擎渲染web视图chapter3-1-5:使用Swagger2构建RESTfulAPIchapter3-1-6:统一异常处理数据访问、日志管理等等,项目地址:程序猿DD/SpringBoot-Learning-码云Gitee.com
2.项目名称:springboot实践学习案例springboot-learning-example
项目结构:
a.『基础-入门篇』
springboot-helloworld《SpringBoot之HelloWorld详解》springboot-properties《SpringBoot之配置文件详解》b.『基础-Web业务开发篇』
springboot-restful《Springboot实现Restful服务,基于HTTP/JSON传输》《SpringBoot之RESRfulAPI权限控制》springboot-freemarker《SpringBoot集成FreeMarker详解案例》springboot-validation-over-json《SpringBootHTTPoverJSON的错误码异常处理》c.『基础–数据存储篇』
springboot-mybatis《Springboot整合Mybatis的完整Web案例》springboot-mybatis-annotation《SpringBoot整合MybatisAnnotation注解的完整Web案例》springboot-mybatis-mutil-datasource《SpringBoot整合Mybatis实现Druid多数据源详解》d.『基础–数据缓存篇』
springboot-mybatis-redis《SpringBoot整合Redis实现缓存操作》springboot-mybatis-redis-annotation《SpringBoot注解实现整合Redis作为缓存》e.『其他篇』
springboot-elasticsearch《SpringBoot整合Elasticsearch,实现functionscorequery权重分查询》springboot-dubbo-serverspringboot-dubbo-clientDubbo服务提供者工程和Dubbo服务消费者工程《Springboot整合Dubbo/ZooKeeper详解SOA案例》《SpringBoot中如何使用DubboActivate扩展点》SpringDataES篇
spring-data-elasticsearch-crud《SpringDataElasticsearch-基本案例》spring-data-elasticsearch-queryspring-data-elasticsearch-实战案例详解项目地址:泥沙砖瓦浆木匠/springboot-learning-example-码云Gitee.com
Spring相关项目推荐:
1.项目名称:基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构
项目内容:基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中权限管理(单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和通知等,支持服务治理、监控和追踪,努力为中小型企业打造全方位J2EE企业级开发解决方案。
项目地址:shuzheng/zheng-码云Gitee.com
2.项目名称:模块化开发系统ybg-spring-fast
项目简介:以SpringBoot为中心,模块化开发系统,用户可以随意删减除权限框架外任意的系统模块。复用,组装性强主要应用技术:springSecurity+Ehcache+quartz+swagger2+Mysql5.6+springjdbc+druid+springsocial+springsession+layerui+vue.js等。
项目地址:YYDeament/ybg-spring-fast-码云Gitee.com
3.项目名称:JAVA分布式快速开发平台iBase4J
项目内容:JAVA分布式快速开发平台:SpringBoot,SpringMVC,Mybatis,mybatis-plus,motan/dubbo分布式,Redis缓存,Shiro权限管理,Spring-Session单点登录,Quartz分布式集群调度,Restful服务,QQ/微信登录,Apptoken登录,微信/支付宝支付;日期转换、数据类型转换、序列化、汉字转拼音、身份证号码验证、数字转人民币、发送短信、发送邮件、加密解密、图片处理、excel导入导出、FTP/SFTP/fastDFS上传下载、二维码、XML读写、高精度计算、系统配置工具类等等。
项目地址:iBase4J/iBase4J-码云Gitee.com
4.项目名称:JavaEE(J2EE)快速开发框架ThinkGem
项目内容:JavaEE(J2EE)快速开发框架,基于经典技术组合(SpringMVC、ApacheShiro、MyBatis、BootstrapUI),包括核心模块如:组织机构、角色用户、权限授权、数据权限、内容管理、工作流等。虽说很长时间没有大的更新了,但它的架构精良易于扩展深受大家喜爱,依然是中小企业的首选,它的功能设计、底层架构也非常具有参考意义、是学习入门的首选。关注我ThinkGem开源中国博客了解4.0最新动态。
项目地址:ThinkGem/JeeSite-码云Gitee.com
5.项目名称:Java快速开发平台MCMS
项目内容:完整开源,Java快速开发平台。基于Spring、SpringMVC、Mybatis架构,MStore提供更多好用的插件与模板(文章、商城、微信、论坛、会员、评论、支付、积分、工作流、任务调度等,同时提供上百套免费模板任意选择),价值源自分享!铭飞系统不仅一套简单好用的开源系统、更是一整套优质的开源生态内容体系。
项目地址:铭飞/MCMS-Gitee
6.项目名称:基于SpringCloud微服务化开发平台AG-Admin
项目内容:AG-Admin是国内首个基于SpringCloud微服务化开发平台,具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关API管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。核心技术采用Eureka、Fegin、Ribbon、Zuul、Hystrix、JWTToken、Mybatis等主要框架和中间件,前端采用vue-element-admin组件。
项目地址:老A/AG-Admin-码云Gitee.com
7.项目名称:轻量级的SpringBoot快速开发平台renren-fast
项目简介:renren-fast是一个轻量级的SpringBoot快速开发平台,其设计目标是开发迅速、学习简单、轻量级、易扩展;使用SpringBoot、Shiro、MyBatis、Redis、Bootstrap、Vue2.x等框架,包含:管理员列表、角色管理、菜单管理、定时任务、参数管理、代码生成器、日志管理、云存储、API模块(APP接口开发利器)、前后端分离等。
关于springboot面试常问和java面试中经常被问到的问题的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。