应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Idea和Spring都不推荐使用Autowired注解,你

  前言
  最近看到了很多关于Autowired不一样的用法代码,现在将收获到的知识分享给大家。
  Autowired比你想象中更强大,它主要作用范围包含构造器、方法、参数、成员变量、注解。
  1。Autowired的默认装配
  熟悉Spring的都知道Autowired注解,是用来自动装配对象的。
  示例如下:packagecom。sue。cache。service;importorg。springframework。stereotype。Service;ServicepublicclassProductService{publicvoidproduct(){无参构造}}packagecom。sue。cache。service;importorg。springframework。stereotype。Service;ServicepublicclassProductService2{Autowired注入对象privateProductServiceproductService;publicvoidproduct2(){午餐构造}}
  正常情况下是可以装配成功的,都知道spring默认按照类型注入的(即byType方式)。
  看过底层源码的应该知道,Autowired注解有一个required参数,其值默认为true(默认开启自动装配),如果不想使用自动装配可将该参数设置成false。2。多个相同类型对象如何处理的?
  可以设想一下,如果多个相同类型的对象,再用Autowired来注入这同类型的对象会发生什么?
  项目新建一个目录,创建一个同名的类ProductService。示例如下:packagecom。sue。cache。service。test;importorg。springframework。stereotype。Service;ServicepublicclassProductService{publicvoidproduct(){}}
  再启动项目时,抛出如下的异常:Causedby:org。springframework。context。annotation。ConflictingBeanDefinitionException:AnnotationspecifiedbeannametestService1forbeanclass〔com。sue。cache。service。test。TestService1〕conflictswithexisting,noncompatiblebeandefinitionofsamenameandclass〔com。sue。cache。service。ProductService〕
  这个异常时告诉我们类名称有冲突,然后项目嗝屁了,起不来了。注意:
  其实这并不是因为Autowired注入了两个同类型的对象导致的。其实是spring中Service注解不允许有同名的类,spring自动把类首字母大写转为小写作为它管理的bean名称,默认情况下bean名称必须是唯一的。
  如何产生两个相同的类型bean?:publicclassProductService1{publicvoidproduct1(){}}ServicepublicclassProductService2{AutowiredprivateProductService1productService1;publicvoidproduct2(){}}ConfigurationpublicclassProductConfig{Bean(productService1)publicProductService1productService1(){returnnewProductService1();}Bean(productService2)publicProductService1productService2(){returnnewProductService1();}}
  在ProductConfig类中手动创建ProductService1实例。
  重启项目抛出异常:
  抛出异常,提示productService1是单例的,却找到两个实例。
  两个类实现同一个接口后,另一个类Autowired这个接口,也会产生两个相同的类型bean异常,实例如下:publicinterfaceIUser{voidsay();}ServicepublicclassUser1implementsIUser{Overridepublicvoidsay(){}}ServicepublicclassUser2implementsIUser{Overridepublicvoidsay(){}}ServicepublicclassUserService{AutowiredprivateIUseruser;}
  项目重启抛出异常:
  和上面一样的配出同样的异常信息。
  不难看出,实际项目中第二种情况在我们实际项目中遇到的更多!3。Qualifier、Primary
  当然在项目中用Autowired装配对象时,是解决不了上面的问题。这是就是spring的强大之处了,spring还给我们提供了改用按名称装配实例。
  此时用AutowiredQualifier(beanName)可以完美解决上述问题:ServicepublicclassUserService{AutowiredQualifier(user1)privateIUseruser;}
  调整之后,再重启项目就ok了。
  Qualifier一般都是和Autowired结合使用,通过Qualifier的参数指定一个bean的名称,实现多个同对象的装配。
  Spring还给我们提供了Primary注解解决上面的问题。在一个对象上加上Primary注解:PrimaryServicepublicclassUser1implementsIUser{Overridepublicvoidsay(){}}
  此时另一个对象只使用Autowired注解即可:ServicepublicclassUserService{AutowiredprivateIUseruser;}
  重启项目,一样解决了问题。当用Autowired自动装配对象时,有多个同名对象,其中一个使用Primary注解修饰,就会把该对象作为候选者被选中,来作为自动配置的值。
  注:其实项目中这种方式不是很常用。4。Autowired作用范围
  下面我们聊一聊Autowired注解除了作用在成员变量上,还有哪些作用范围?
  看看源码中Autowired注解的定义:
  不难看出Autowired作用在5种目标类型上,图例总结一下:
  接下来,我们重点看看在其他地方该怎么用?4。1成员变量
  Autowired作用在成员变量上:ServicepublicclassUserService{AutowiredprivateIUseruser;}4。2构造器
  Autowired作用在构造器上:ServicepublicclassUserService{privateIUseruser;AutowiredpublicUserService(IUseruser){this。useruser;System。out。println(user:user);}}
  注意:Autowired作用在构造器上,实际仍然用Autowired装配方式,并非构造器装配。4。3方法
  Autowired作用在普通方法上:ServicepublicclassUserService{Autowiredpublicvoidtest(IUseruser){user。say();}}
  项目启动中,Spring自动调用一次加了Autowired的方法此时可以在该方法内做一些初始化工作。
  Autowired也可以作用在setter方法上:ServicepublicclassUserService{privateIUseruser;AutowiredpublicvoidsetUser(IUseruser){this。useruser;}}4。4参数
  Autowired作用在构造器的入参上:ServicepublicclassUserService{privateIUseruser;publicUserService(AutowiredIUseruser){this。useruser;System。out。println(user:user);}}
  Autowired作用在非静态方法的入参上:ServicepublicclassUserService{publicvoidtest(AutowiredIUseruser){user。say();}}4。5注解
  基本没人用,偷个懒不介绍了5。Autowired的高级玩法
  上面几种Autowired都是自动装配单实例,其实它也能自动装配多个实例,惊喜补,怎么回事呢?
  把UserService成员变量变通一下,用List集合接收IUser类型的参数:ServicepublicclassUserService{AutowiredprivateListIUseruserList;AutowiredprivateSetIUseruserSet;AutowiredprivateMapString,IUseruserMap;publicvoidtest(){System。out。println(userList:userList);System。out。println(userSet:userSet);System。out。println(userMap:userMap);}}
  创建一个UController:RequestMapping(u)RestControllerpublicclassUController{AutowiredprivateUserServiceuserService;RequestMapping(test)publicStringtest(){userService。test();returnsuccess;}}
  启动项目并调用接口:
  控制台中:userList、userSet和userMap都分别打印出来了各自的元素,并没有抛出异常,说明Autowired会自动把相同类型的IUser对象收集到集合中。6。Autowired一定能装配成功?
  有时候就算用了Autowired装配的对象结果还是null,这又是怎么回事呢?6。1不打Service注解
  在类上面不加Controller、Service、Component、Repository等注解,这种情况下Spring就不能完成对象的装配,示例如下:publicclassUserService{AutowiredprivateIUseruser;publicvoidtest(){user。say();}}6。2注入Filter或Listener(装配过滤器或监听器)
  web项目启动的顺序:listenerfilterservlet。
  示例如下:publicclassUserFilterimplementsFilter{AutowiredprivateIUseruser;Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{user。say();}OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{}Overridepublicvoiddestroy(){}}ConfigurationpublicclassFilterConfig{BeanpublicFilterRegistrationBeanfilterRegistrationBean(){FilterRegistrationBeanbeannewFilterRegistrationBean();bean。setFilter(newUserFilter());bean。addUrlPatterns();returnbean;}}
  此时我们启动项目一样会抛出异常,并告诉我们tomcat不能正常启动:
  这又是什么原因呢?
  Springmvc的启动主要依靠DisptachServlet(常说的核心处理器),而核心处理器是在listener和filter之后执行的。那么此时我们在监听器或者过滤器里面用Autowired装配某个对象时,因此此时核心处理器还没执行,bean还没有初始化,自然无法完成自动注入的。
  下面我们讲一讲项目中遇到这种情况该怎么处理呢?publicclassUserFilterimplementsFilter{privateIUseruser;Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{ApplicationContextapplicationContextWebApplicationContextUtils。getWebApplicationContext(filterConfig。getServletContext());this。user((IUser)(applicationContext。getBean(user1)));user。say();}OverridepublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{}Overridepublicvoiddestroy(){}}
  这里用到了WebApplicationContextUtils。getWebApplicationContext获取当前的ApplicationContext,再通过它获取到bean实例(其实这里实际用到的是Java里面的反射来完成的,小伙伴们可以了解一下)。6。3注解未被ComponentScan扫描
  Spring中Component、Repository、Controller、Service、Configuration等注解,是需要通过ComponentScan注解扫描,收集元数据的。
  试想一下,不加ComponentScan,或配置的ComponentScan扫描的包路径错误,或包路径范围太小,此时也会导致有些注解的元数据无法收集,最后导致Autowired不能自动注入bean。
  当然Springboot项目中就不存在此类问题,Springboot的SpringBootApplication注解,已经内置了ComponentScan注解。6。4循环依赖问题
  循环依赖,相信伙伴们都遇到过吧,这里简单说一下,如果A依赖于B,B依赖于C,C又依赖于A,就形成了死循环依赖。
  Spring的bean默认是单例的,单例对象用Autowired自动注入,大多数情况能解决循环依赖问题。
  那么当bean是多例的情况下,就会出现循环依赖,导致bean无法自动注入。7。Autowired和Resouce的区别
  有时候Autowiredw无法解决,改成Resource却能解决问题。接下来,我们重点看看Autowired和Resource的区别。Autowired默认按类型自动注入,而Resource默认按名称自动注入。Autowired只有一个参数:required,意思是是否开启自动注入,默认是true。而Resource有七个参数,最重要的两个参数:name和type。AutowiredQualifier结合使用也可以实现按名称注入。而Resource如果指定了名称,则按名称自动注入,如果指定了类型,则按照自动注入。Autowired可用在:构造器、方法、参数、成员变量和注解上,而Resource能用在:类、成员变量和方法上。Autowired是spring定义的注解,而Resource是JSR250定义的注解。Autowired和Resource的装配顺序不同。
  Autowired的装配顺序如下:
  Resource的装配顺序如下:
  1。如果同时指定了name和type
  2。如果指定了name
  3。如果指定了type
  4。如果既没有指定name,也没有指定type:
  关注公众号:编程怪咖,学习更多知识。

43岁宝妈面部提升真实经历10年做了7次整形,还有一次面部提档案:赵女士项目:PST面部提升白天上班,晚上回家,还要照看老公和孩子,那段时间真的好累!年轻时候还会做下保养,双眼皮、鼻子都做了,感觉还不错,但是这几年生完……4千年难得一见的美女鞠婧祎,疑似花4千万整容变脸,真假拭目以鞠婧祎,现24岁,擅长歌手,舞蹈,演员,完美颜值,身材连女生都羡慕和尖叫,热舞更是让网友春心荡漾,网友心中的完美女神。她从47976名参选者中脱颖而出,成为大型女子偶像团……盘点熊孩子办的那些分分钟让老母亲气血上涌的事又到了神兽归笼的季节,有些娃天生就是个天使宝宝,不但不用父母督促学习,还能成为父母的小帮手,而有些熊孩子,一时不注意,分分钟就能干出一件让父母血压飙升的事情来。8岁资深游戏玩家……罗技键鼠礼盒虎年吉祥款评测性能颜值双在线,值得入手每到新春佳节即将来临之际,都会出现一些新春定制套装出现,即便是相对冷门的数码产品也不例外,前不久笔者就收到了由罗技推出的新春键鼠套装,即罗技键鼠礼盒虎年吉祥款(MXMasste……铜2022年世界铜矿产量预计增长3。9,2023年预计增长约2022年世界铜矿产量虽然继续增长,但与ICSG2022年4月的预期相比,表现不佳,导致增长率从5下调至3。9。与新冠肺炎相关的持续限制和劳动力缺勤、运营和岩土工程问题、……李纯淡妆走机场,身穿黑白拼接大衣格外亮眼,气质感真挺强在很多人的眼中,大衣是很百搭的存在,对于身材还有很好的修饰作用,成了很多人秋冬季节的第一选择。不过真的想利用大衣穿出时尚感,没有点穿搭技巧,还真的是不行,如果选错了大衣版型和大……冬天这样吃土豆太香了,我每周都要做一次,让人无法拒绝最近因为台风影响,我所居住的小城下起了淅淅沥沥的小雨。气温骤降好几度,又因为下雨是湿冷,大家都直呼太冷了,受不了。在能呆在家绝不会想要出门的日子里,建议大家囤多一些土豆和芝士,……义工旅行背后的生意经宣称免单暗藏风险,组织方无相关资质编者按:线上追星、陪玩,线下剧本杀、密室逃脱近年来,多种新兴社交娱乐方式和产品在Z世代中悄然流行。年轻人如何投身其中,如何看待这些产品带来的影响,正向引导青少年健康成长,成为新……五大联赛评分最佳阵容,梅西力压本泽马,巴黎本围绕梅西设计战术五大联赛评分最佳阵容,梅西居然力压本泽马统计出了赛季评分最佳阵容,其中曼城、利物浦和巴黎圣日耳曼成为了最大的赢家,他们各有两名球员入选,但是梅西的赛季平均评分在最佳阵容当……DOTA2中国赛区DPCS级联赛将要打响,LGD能否拿下开门新的一年已经到来,随后中国赛区DPCS级联赛的赛事也将要打响,EHOME、FPX、LGD、Aster这些队伍也将在首个DPC联赛当中开始他们的比赛,接下来就一同了解一下,未来C……独中两元后,当选当轮MVP,这位19岁的星二代,何时踢西甲主虽然一样是将门虎子,但是迭戈西蒙尼没有像齐达内那样,利用自己的各种关系让儿子前往豪门一队刷资历。西蒙尼的做法很务实,他只让小儿子在马竞二队试水,然后把他租借到了西乙的球队锻炼。……陕西推动文旅资源活起来新华网西安4月30日电(记者张斌)陕西省文化和旅游厅、唐华北斗数据中心、海南国际文化艺术品交易中心近日在西安签署战略合作协议,旨在进一步推动文化旅游资源数字化发展,让文旅资源活……
刘诗诗的粉红史,从傻白甜到十亿阔太,3段情史太精彩在北京某家舞蹈教室里,一个女孩垫着脚尖在翩翩起舞。她的腿很直白,腰很细软,脸很清纯动人。这个在跳芭蕾舞的女孩子就是刘诗诗,她从小就喜欢跳舞,长大后的梦想是当一名舞蹈……查出甲状腺结节,饮食注意2吃2不吃2吃山药:山药具有很好的养胃功效,也可以帮助甲状腺滋养,对于维持身体中内分泌平衡有很好帮助,坚持吃山药也可以帮助缓解甲状腺组织增生问题,帮助结节悄悄远离你。黑木耳:……全球都在贸易逆差,到底谁在顺差?德国,传统制造业强国,产品畅销全球,欧洲经济火车头,自1991年东西德合并以来一直是贸易顺差。2022年5月,德国持续30年的贸易顺差被打破,首次出现贸易逆差,金额为10……11中3后15中5!勇士夏联核心低迷沉底三分11中1如何入主金州勇士队进入夏季联赛之前,金州媒体认为他们拥有一支超强的夏季联赛球队:詹姆斯怀斯曼、鲍德温、库明加、穆迪、罗林斯、桑托斯但两场比赛过去怀斯曼、鲍德温、罗林斯、库明加都还没有登……在中国有100万存款,算什么水平?银行员工说出了答案我国可以称得上是世界上知名的储蓄大国,相关数据显示,我国目前的居民储蓄率高达45,远远超过了世界平均水平。毕竟,存钱是我们老一辈代代相传下来的良好习惯。所以在当今社会,每个家庭……打卡网红江南天路,这样的自驾游才带劲是否厌倦了千篇一律的自驾游?不是到郊外转转,就是到别的城市溜达一圈想要get不一样的自驾体验那么不妨跟着D90Pro一起打卡网红江南天路这里有九曲十八弯……华为鸿蒙OS系统或重蹈三星覆辙!国产友商全都不用用户数或将减【7月18日讯】导语,自从华为在2021年6月2日正式发布鸿蒙HarmonyOS2。0系统后,就让华为HarmonyOS系统全面在电视、手表、手机等产品上安装使用,正面开启了国……你还在无效防晒吗?我是大医生带您了解夏季护肤注意事项您的皮肤是否已经提前衰老?人类的皮肤衰老除了内源性的细胞衰老之外,最主要的因素还是外源性的老化。在这些外源性的因素中,日光照射是造成皮肤衰老的第一要素,被医生俗称为光老化……烟雨长城云雾中的长城仙女楼(7月4日摄,无人机照片)。当日,大雨过后,位于北京市密云区和河北省滦平县交界处附近的长城云雾缭绕,如同水墨画一般。新华社记者陈晔华摄云雾中……普信老婆包文婧,把娇妻文学搬进娱乐圈包文婧回应怕孙怡爱上包贝尔恐怕谁都很难想到,孙怡和董子健离婚,最委屈的人却是包文婧!最近有一个很流行的地狱笑话,董子健和孙怡离婚,最害怕的人是包文婧。你以为是……重量级两大天王级人物!维尔德准备复出,乔书亚训练过度呈现疲态【文搏击江湖】当今重量级两大天王级的人物有了最新动态,一个是前WBC重量级拳王美国青铜轰炸机德昂泰维尔德,一个是前三冠王英国人安东尼乔书亚,他们两个都曾经叱咤风云,红极一时,可……过膝裙才是60岁女人的标配!优雅又显年轻,气质也高级夏季是穿裙子的季节,不管哪个年龄段的女性们都逃不开对于裙装的钟爱,但是年长一些的大龄女性们在选择裙装的时候通常会比较受限,总是感觉随着年龄的增长,在穿搭的时候各种单品都驾驭不了……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网