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

为什么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提示的警告信息,讲解这种注入方式的缺点,希望大家在今后的开发过程中多多使用构造器注入的方式,养成良好的编码习惯。

又一个比烂的时代,看谁更烂熬不住当驱动世界的旧模式失效,新模式还没成熟,经济总量就会有一段时间陷入停滞,这个时期就是比烂的时代。每次比烂时代都是国际冲突频发,国力迭代的开始。这是一个最好的时代,也是一个最坏的时代储蓄大国到负债大国,人均背债14。2万,国人钱都花哪了?文桐影中国人普遍都有储蓄的观念,把钱存起来以备将来之需。在这种背景下,我国也成为了一个储蓄大国。虽然储蓄率从2008年的54下降到现在的46,但与全球平均的储蓄率29相比还是高出不2030年可再生氢100GW的发展模式展望氢能是中国未来低碳能源体系中的重要组成要素2020年9月,中国政府提出了双碳发展目标,为能源转型和应对气候变化开创了新纪元,中国的能源结构和体系继续向清洁化低碳化安全化深度转型。其一轮明月腾空起,遥寄相思泪连连头号周刊今夜月正明今夜合家共团圆唯有我和你再难共此时一轮明月腾空起遥寄相思泪连连我在月下独徘徊月儿圆,泪水流你在远方可安好是否也在赏月圆月儿圆圆照我心请把我的思念带给你爱是你和我痛人间清醒文案值得阅读1你的好运都藏在努力与付出里2真正懂你的人,无须太多的解释,3哪怕变好一点点,也觉得欣慰。e4重要的不是角色,而是角色中真实的自己。5世界很大,应该去寻找另一个自己。6所有的安全感男人为什么离不开酒?每一句都是入骨一个人一生中大部分时间都在喝酒。真正的男人不能没有女人,也不能没有酒。每个人心中都有关于美酒的记忆有的热情,有的柔情,有的喜忧参半,有的幸福分封!酒与男人有着不解之缘,男人的感情,早安忙而不慌,所有经历都是成长太阳早安今天太阳今天是2022年9月12日,星期一,农历八月十七给生活比个心,每天忙碌到爆炸,但也充实到极点,这才是年轻该有的状态,忙而不慌,所有经历都是成长。只要你想,永远不晚只越过越有钱的人,往往有以下共性文夏莫01卷首语人的一生,就像是一场精彩的游戏。有些人,能在历练中,变成高手而有些人,被困难打败,失败出局。有钱,是一种状态。每个人,都可以通过努力,改变自己贫穷的境遇。莎士比亚曾今年开始,手握大量现金的人有可能睡不着觉?3点原因很现实受传统思想的影响,我国老百姓一直都比较勤俭节约。但这也让我国成为储蓄率最高的国家。据了解,当前我国储蓄存款值已经突破了百万亿元。此外,我国老百姓存钱,也是为了提高自身抵御风险的能力30的女生,如果可以很好地坚持这些小习惯,显白又减龄毋庸置疑,我们来到了看脸的时代,一白遮百丑的大众审美让我们都想拥有白皙水润的肌肤。也对,长得白皙的女生无论穿什么颜色的衣服都没啥问题,也显得人更青春,而脸色暗沉的女生,穿衣则会有很意甲最新积分榜AC米兰客胜攀升第2,那不勒斯绝杀成功登顶昨晚今晨,意甲联赛第6轮先战3场,AC米兰客场21击败桑普多利亚,升至积分榜第2位,莱奥吃到红牌,吉鲁点射绝杀国米主场10击败都灵,结束了近期的2连败,布罗佐维奇在第88分钟破门那
钻石垄断被打破?中国年均培育300万克拉钻石,河南功劳最大钻石是骗局这种说法,相信很多人都听说过吧!其实天然钻石产量并不低,但钻石商人为了抬高钻石售价,对钻石矿实行垄断,慢慢开采,让流入到市场上的钻石变少。但是早期购买钻石的人主要是贵族和英国政府逼阿布出售切尔西!别高兴得太早,欧足联会更加针对英超北京时间3月3日,切尔西老板罗曼阿布拉莫维奇通过切尔西官方网站发布公告,他宣布决定出售切尔西。阿布出售切尔西是被逼无奈,要不是俄乌冲突,要不是因为英足总的双标对待,阿布也不会出售切CBA官方承认两次误判,11个字掩盖业余错误,杜锋广东蒙不白之冤北京时间3月5日,在今天CBA官方发布公告,承认在此前广东和新疆那场比赛当中出现了重大的误判,但是却只字不提技术台的失误,这让人非常的无语,更让广东队蒙受了不白之冤。此前进行的CB突发!因涉及问题,本周英超德甲或在中国停播英超官方宣布在本周末的英超比赛中,所有20家俱乐部的队长将佩戴乌克兰国旗颜色的特殊袖标,球场的大屏幕有足球团结一致的字样,颜色背景与乌克兰国旗一致。昨晚,足球评论员詹俊发文,侧面本什么是巨星?什么是球星效应?看一下今天某直播平台,观看人数,一目了然,今天有公牛vs雄鹿的比赛,有奇才vs老鹰的比赛,有掘金vs火箭的比赛,有鹈鹕vs爵士的比赛,有魔术vs猛龙的比赛,有森林狼vs雷霆的比赛,禁赛16年!37岁俄罗斯世界冠军遭重罚没收奥运奖牌将被迫退役北京时间3月4日晚间,世界反兴奋剂机构通报了6名俄罗斯运动员兴奋剂违规的情况,以及更新后的处罚决定。其中,世界冠军阿卡耶夫受到了最严厉的处罚,他的禁赛期被延长到了2035年,这几乎李春江在发布会上发言不慎暗讽辽篮,梁子结下了CBA第30轮一场强强对话,以上海队21分大逆转辽宁队告终。凭借这一场胜利,上海队成功反超辽宁队登顶联赛榜首。CBA这几年来辽粤争霸的格局,似乎到了日月换新天的时刻。赛场上的硝烟还韩媒韩国残奥队自备伙食,解决队员吃不饱问题,网友看好西瓜北京冬残奥会即将拉开序幕,各国选手纷纷入驻为即将到来竞技赛事做准备,在正式开村的第一天,到来奥运村的人数就超过600人。这场盛事没有少了韩国队,不过不同于其他国家选手,跟随队伍来中2022年,你怎么在向一个恶汉转变呢?历数翟小川三次争议事件翟晓川和裁判事件一与女记者对喷时间2022年1月9日场次联赛第20轮对阵北京首钢VS浙江广厦事件经过北京时间2022年1月9日,在北京首钢和浙江广厦队的第四节比赛中断时,与裁判交流惠若琪年少成名的可爱姑娘,中国女排当之无愧的第一女神2021年,陈可辛导演的电影夺冠上映,在电影中中国女排的故事打动了无数人。而在现实生活中,中国女排作为国际赛场上最强悍的队伍之一,可以和中国乒乓球一样成为了国人的骄傲。虽然排球这项春天,韭菜荠菜靠边站,多吃平菇,鲜嫩美味营养极高,炒鸡蛋真香导语春天,鸡蛋和它是绝配,鲜嫩美味营养高,炒一炒就上桌,别不懂吃!春天,气候变暖,万物复苏,又到了尝鲜的季节!俗语说不时,不食。春季多吃应季食物,对我们的身体健康是非常有益的!春季