范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

为什么IDEA不推荐使用Autowired注入?

  #头条创作挑战赛#前言
  最近项目上在做代码重构,在Bean的字段注入方式上,IDEA报了警告,Field injection is not recommended (字段注入是不被推荐的),如下图所示:
  作为有代码洁癖的我不能忍,大家都是这么用的啊,为什么会有这样的警告呢?有什么替代方案呢?为什么不推荐?
  因为@Autowired在字段上注入实在是太方便了,有了@Autowired基本不需要提供setter和构造器,省去了很多代码。但是@Autowired字段注入存在下面的问题:NPE问题
  使用字段注入容易出现空指针问题,如下代码所示:因为Spring IOC容器在使用字段依赖注入时,并不会对依赖的bean是否为null做判断,因此在下面的代码中,通过 @Autowired 注入的user对象可能为空,而JVM 虚拟机在编译时也无法检测出user为null,只有在运行时调用user的方法时, 发现user为null,出现空指针异常(NPE)。@Component  public class FieldBasedInjection {      private String name;      @Autowired     private final User user;      public FieldBasedInjection(){         this.name = user.getName(); // NPE      }  }
  总结一下,Java 在初始化一个类时,是按照 静态变量或静态语句块 ->实例变量或初始化语句块 -> 构造方法 -> @Autowired 的顺序。所以在执行这个类的构造方法时,对象实际尚未被注入,它的值还是 null, 如果属性在被注入前就拿来使用就会导致npe(空指针错误)。和IOC容器耦合度太高
  类通过属性输入,对外部不可见,类和容器的耦合度过高,导致无法脱离容器单独正确运行。比如下面的例子在Spring容器中运行没有问题。@RestController public class TestHandleController {  	@Autowired 	TestHandleService testHandleService;  	public void helloTestService(){ 		testHandleService.hello(); 	} }
  如果我们用下面的方式调用呢?TestHandleController testHandle = new TestHandleController(); testHandle.helloTestService();  // 空指针
  显而易见,就会出现空指针异常,依赖对外部不可见,外界可以看到构造器和setter,但无法看到私有字段,自然无法了解所需依赖,这样十分不利于单元测试。可能导致违反单一职责原则
  使用基于字段的注解,非常简单好用无脑,我们无需关注类之间的依赖关系,完全依赖于Spring IOC容器的管理,但是使用"基于构造器注入的方式", 我们需要手动在类代码中去编写需要依赖的类,当依赖的类越来越多,我们就能发现 code smell,这个时候就能显示的提醒我们,代码的质量是否有问题。 因此,尽管字段注入不直接负责打破单一责任原则,但它通过隐藏了和构造器注入一样发现code smell的机会。 示例代码:@Component  public class ConstructorBasedInjection {     private final Object object;      private final Object object2;                       ...      private final Object objectX;             @Autowired      public ConstructorBasedInjection(Object object,                                                    Object object2,                                                      ...       ,                                                   Object objectX) {                      this.object = object;                       this.object2 = object2;                         ...                       this.objectX = objectX;          } }和Spring框架高度耦合
  @Autowired是Spring框架中的注解,如果你的应用程序想要更换一个IOC框架,虽然这种情况非常非常低,这时候你就需要修改大量的代码了。更推荐的是使用 @Resource注解,@Resource注解是JSR-250提供的,它是Java标准,我们使用的IOC容器应当去兼容它,这样即使更换容器,也可以正常工作。
  上面我们分析了基于@Autowired字段注入方式的各种问题,所以IDEA也不推荐,那么如何解决呢?更推荐的做法【强烈推荐】使用构造器方式注入
  这也是Spring官方强烈推荐使用基于构造器注入的方式, 像国内Dubbo、RocketMQ等很多开源框架的源码都已经转向了基于构造器的注入方式,所以开发中我们应该尊重Spring官方的推荐,尽管其他的方式可以解决,但是不推荐。【一般推荐】使用@Resource注解
  如果你不喜欢构造器注入的方式,觉得使用构造器注入的方式麻烦,还要写代码,虽然不建议你这么想。那么更推荐你使用@Resource注解,@Resource是JSR-250提供的,不是Spring中的注解,它是Java标准,我们使用的IoC容器应当去兼容它,这样即使更换容器,也可以正常工作。如果你使用这个注解IDEA也不会提示警告。
  我们再来看看这两者的区别,@AutowiredVS@Resource。
  提供方@Autowired 是由Spring提供的,包名是:org.springframework.beans.factory.annotation@Resource 是由Java提供的,包名是:javax.annotation
  依赖识别方式@Autowired 默认是以byType方式,可以使用@Qualifier指定bean名称,如果找不到Bean不会自动使用byName方式。@Resource 默认是以byName方式,当byName方式无法匹配时,会使用byType方式。(仅适用于仅注册了一个Bean对象的类型)
  适用对象@Autowired 可以使用在方法,方法参数,构造器,构造器参数,字段上@Resource只能使用在方法,字段上(经过实测,无法注解在构造器和参数上)
  强依赖型@Autowired和@Resource都是具有强依赖性,也就是必须要有这个bean才能启动,不过@Autowired可以设置属性required=false变成非强制注入。【不大推荐】关闭警告提示
  如果你是一个非常懒的人,不想改动任何代码,但又想去掉提示的话,那么我建议你可以直接关掉警告提示。
  打开Editor–>Inspections–>Spring->Spring Core->Code–>Non recommended ‘field’ injections,去掉右边的小勾勾,Apply–>OK即可。
  但是你换一台电脑,重置配置后就又出现了。总结
  本文讲解了Spring字段注入时IDEA提示的警告信息,讲解这种注入方式的缺点,希望大家在今后的开发过程中多多使用构造器注入的方式,养成良好的编码习惯。

爆冷!卫冕冠军无奈出局,法国死里逃生,欧洲杯四强对阵正式出炉男篮欧洲杯激战正酣,进入淘汰赛阶段之后,精彩不断,冷门不断。此前,西班牙逆转芬兰德国力克希腊,率先锁定两个四强席位。经过短暂的休息调整之后,斯洛文尼亚VS波兰,法国VS意大利这两组球王终于可以登场!上海海港,势不可挡!足协杯冠军已是囊中之物前西班牙人副队长亚洲最有人气的中国球王武磊经过夏天一系列努力,终于可以在中超登场了!9月以来中超联赛大部分比赛因为某些原因延期,而其中上海海港队可谓休战时间最长的球队。大半个月的延处暑过天气转凉,如何养生保健康?本周二(8月23日)处暑,是秋季的第二个节气。处意味着终止,处暑指的是炎热的夏季就要结束了。虽然近期南方高温天气频发,四川等地更是河流湖泊干旱,水位下降严重。相信再过一段时间,天气二十四节气与人体健康的秘密,你知道吗?中医学的理论基础是人法地,地法天,天法道,道法自然。每个人的出生时间不同环境不同,体质也就会不尽相同,从而患病时的体征也会有所差别。这就让即使同样的疾病,同样的药物,可能也会起到不豆腐营养价值高,但有些人不适合吃头条创作挑战赛豆腐作为作为常见的豆制品之一,不仅深受人们喜爱,营养还特别丰富,是植物蛋白中少见的优质蛋白。首先,豆腐中富含多种人体必需氨基酸,其中最为丰富的是赖氨酸。赖氨酸是人体内解开经络的千古之谜36舌头按摩方法中医望诊特别看中舌头,通过观察舌头的状态来判断身体的健康状态。那么,按摩舌头也是非常重要,按摩舌头可以有效保健身体,防治疾病。深筋膜与填充在深筋膜之间的疏松结缔组织,它们组合成一个隔夜茶到底能不能喝?有没有危害呢?不少人都听家里老人说过隔夜茶不能喝,茶放久了可能会产生致癌物营养成分降低等问题。除了泡的茶,还有市售的瓶装茶饮料现制奶茶果茶等等,都含有茶的成分,隔夜了到底能不能喝呀?到底什么才算NBA大结局!湖人队即将完成3换3交易1。53亿先生联手詹姆斯太不可思议了,爵士和骑士队正式完成了今夏休赛期第二笔重磅交易,爵士队将当家球星多诺万米切尔交易至骑士队,从而得到了塞克斯顿阿巴基马尔卡宁三个首轮签和两个首轮互换签,当然在这笔交易中CCTV5直播!中国女篮再战世界杯李梦双塔挑大梁郑薇力拼5大强敌中国女篮已经完成了和法国西班牙以及比利时的训练和比赛,目前已经抵达了本次欧洲拉练的最后一站贝尔格莱德,接下来中国女篮将进行为期两周的训练,并且将和塞尔维亚女篮展开两场热身赛。中国女李景亮我在最佳状态期待与弗格森的对决新华社北京9月2日电(记者董意行卢羽晨)北京时间9月11日,中国拳手李景亮将出战终极格斗冠军赛UFC279,在次重量级比赛中对决夜魔托尼弗格森。李景亮在接受新华社记者采访时表示,自国乒四朵金花竞争白热化!陈梦步刘诗雯后尘,敬业精神该学习马龙陈梦会步刘诗雯后尘吗?近段时间以来,热度最高的莫过于成都世乒赛国乒的参赛阵容,由于国乒采取了不同的选拔方式,导致即便是世乒赛还有不到一个月的时间就将举办,但是国乒依然最后两个参赛名
冬季养生正当时,防寒保暖从头护到脚冬季天气干燥且寒冷,昼短夜长,中医认为,自然界有春生夏长秋收冬藏的规律,人与自然相应,在养生时也应该顺应四时气候冷暖变化的规律和特点。冬季万物蛰伏闭藏的特性和肾气相通,因此冬季养生无论阳没阳,提醒家人腊月多吃这2白,滋润养肺,减缓症状冬日生活打卡季最近很多人有了阳性的经历,发烧咳嗽嗓子不适肠胃不适等基本类似的症状。其中最严重的的就是咳嗽肺疼,很多人尤其是早上和睡觉前,咳嗽严重的,感觉快把肺咳出来了。甚至是阳康后随着湖人3连胜太阳4连败,本赛季NBA的附加赛可能是这样!第7和第8名对决开拓者VS勇士开拓者目前战绩19胜18负,位列第7,后场有利拉德和西蒙斯领军,进攻火力不用担心,但是防守堪忧,健康也是问题。而前锋线格兰特和哈特是真汉子,让他们足以篮网连胜终结便是新征程开启之时?胜败乃兵家常事,前行继续我想,连胜的意义不仅仅是记录,以一波超长连胜直追队史记录甚至书写全新记录。连胜则意味着一支球队近来如火状态不俗化学反应不减的进取势头以及球队上下一心众志成城的超强凝聚力这些才是连胜好消息!刘国梁将给樊振东陈梦等分配主管教练,或在世预赛上揭晓头条创作挑战赛北京时间1月4日,中国乒乓球协会官网发布新一届国家队教练员人选,除了已经确定的总教练李隼,男队主管教练王皓,女队主管教练马琳,混双主管教练肖战之外,正式公布了10名教哈姆脚踝扭伤后施罗德坚持留在场上他说他会表现得很棒!直播吧1月5日讯今日NBA常规赛,湖人主场112109险胜热火,赛后哈姆接受了媒体采访。谈到施罗德比赛中扭伤脚踝,仍带伤出战砍下32分,哈姆表示2013年在亚特兰大,我就爱上了这个宁波两连胜,零零后小将赵俊峰远程神炮立功宁波町渥连续战胜了山西上海,取得了两连胜,所以才有一句玩笑话今年宁波男篮未尝败绩!玩笑归玩笑,说实话,这两仗,宁波打得确实好。除了两个外援泰勒和托罗多维奇,本土球员中,零零后小将赵夫妻阳康后着急备孕被医生劝阻,建议先把身体养好一对夫妻阳康后着急备孕,被医生劝阻,医生晒出其显微镜下的精子。没阳之前,精子数量多,跑得快阳了之后,精子数量少,质量差,都老化了。医生表示,精子怕高温的环境,发热之后会导致精子的质国服重生之我是小胖子抽卡建议前言一觉醒来竟重生成为小胖子,复仇者迷路徘徊竟成孤勇者,亡者为何重返人间?这一切的背后是人性的扭曲?还是道德的沦丧?不得不说WY真会玩。赶在凯撒出来之前倒垃圾。这样下一个卡包应该是瑞承传承中心全景解读Web3。0,助力新生代把握时代机遇随着信息技术的发展,互联网从Web1。0演变至Web3。0。Web1。0时代,是静态互联网,用户被动接受网站提供的内容而Web2。0时代,是互动性质的移动互联网,用户既可获取信息,央视2022年十佳主持人出炉,董卿朱广权任鲁豫无缘上榜央视是一个群英荟萃的大舞台,也是众多主持人梦寐以求的平台。在人才济济的央视中,如果能够获得年度十佳主持人称号,无疑于是对个人成就的一种极大认可。2022年央视十佳主持人名单已经新鲜