服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

使用 @Autowired 为什么会被 IDEA 警告,应该怎么修改最佳?

日期: 来源:Java知音收集编辑:

问题原因

关于这个问题,其实答案相对统一,实际上用大白话说起来也容易理解。

1.初始化问题

先看一下Java初始化类的顺序:

父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器

而Autowired注入,则要排队到子类构造器以后了,SpringIOC并不会对依赖的bean是否为null做判断,JVM编译时同样也不会有问题,但如果使用不当,运行起来时或许会因为出现空指针异常。

2.对IOC容易依赖过强

@Autowired由Spring提供,而@Resource是JSR-250提供的,它是Java标准。前者会警告,而后者不警告,就是因为前者导致了应用与框架的强绑定,若是换成其他IOC框架,则不能够成功注入了。其实对于这方面,我认为在大多数情况时是不会有什么问题的。

3.其他方面

我看到网络上有一些其他方面的总结,比如:依赖过多却不够明显,违反了单一职责原则;不能像构造器那样注入不可变的对象等,这类问题需要结合个人实际开发进行判断。

对于@Autowired使用方面,它虽然是将业务代码和框架进行了强绑定,但字段注入确实大幅简化了代码。追求完完全全的松耦合其实也过于理想化,应该在实际使用中追求平衡,否则将为了过度追求松耦合而得不偿失。

其他使用方式

除了使用@Autowired以外,我们其实也有几种好用的方式。使用@Resource替代@Autiwired方法是其中一种,只需要改变一个注解,这里就不展示了。

1.set方法

@RestController
public class TestController2 {

    ITestService testService;

    /*
     * 基于set注入
     * */
    @Autowired
    public void setTestService(ITestService iTestService) {
        this.testService = iTestService;
    }

    @GetMapping("/status2")
    public Result<?> status() {
        return testService.status();
    }
}

这种方法也使用了@Autowired注解,但是它是作用于成员变量的Setter函数上,而不是像Fied注入一样作用于成员变量上。

2.构造器

@RestController
public class TestController1 {

    ITestService testService;

    /*
    * 基于构造方法的注入
    * */
    public TestController1(ITestService iTestService) {
        this.testService = iTestService;
    }

    @GetMapping("/status1")
    public Result<?> status() {
        return testService.status();
    }
}

它的好处在于,采用了构造方法注入,这种方式对对象创建的顺序会有要求,它将避免循环依赖问题。是最可靠的方法。

3.构造器的简化版(推荐)

首先,需要引入lombok依赖。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.2</version>
</dependency>

随后,我们在创建时就可以使用@RequiredArgsConstructor注解,它将帮我们创建构造器,final关键字必不可少。

@RestController
@RequiredArgsConstructor
public class TestController3 {
    /*
     * 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层
     * */
    private final ITestService testService;


    @GetMapping("/status3")
    public Result<?> status() {
        return testService.status();
    }
}

我们在使用这些创建方法时,都可以调出IDEA的结构(Structure)面板进行查看,如下图所示。

可以看到,在这个类中,已经存在我们所需要注入的内容。

在网上有博主总结了一张表,但因为到处能看到,不知原来出处是哪里。

总结

在使用中,使用构造方法是比较可行的,加上lombok,其实也可以到达非常简便。

作者:赵昕彧

来源:blog.csdn.net/qq_40579464/article/

details/129006885

推荐

Java面试题宝典

技术内卷群,一起来学习!!

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。点“在看”支持我们吧!

相关阅读

  • UUID的弊端以及雪花算法

  • 一、问题为什么需要分布式全局唯一ID以及分布式ID的业务需求在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识如在美团点评的金融、支付、餐饮、酒店;猫眼电影等
  • 开启幸福之门的密码

  • 有趣的课程、实验的突破、靓园的拌面、樱花的绽放……什么会让你感到幸福?最近的一个幸福瞬间又是何时?幸福是什么?如何变得更幸福?明天是第十一个“国际幸福日”让我们跟随心理
  • 吉林探索“一站式”矛盾纠纷化解新模式

  • 近年来,吉林省大力推行矛盾纠纷化解“一站式”平台建设,形成多元化解矛盾纠纷新格局。2022年5月,吉林省委政法委下发《关于进一步加强全省综治中心规范化建设和实体化运行的通
  • 瓶窑老街当选!杭州十大放心消费示范商圈公布!

  • 近日,由杭州市场监管局组织评定的2022年度杭州市十大放心消费示范商圈名单出炉,瓶窑老街成功斩获此项荣誉!瓶窑老街位于杭州西北郊,毗邻苕溪,背靠窑山,连接良渚古城遗址公园,保留了
  • 余杭开放4个艾滋病自愿咨询检测门诊!免费!

  • 检测是知晓艾滋病感染的唯一途径。小余儿从区疾控中心了解到,我区艾滋病自愿咨询检测(VCT)门诊于近日正式开放!什么情况下有必要预约?如何预约?今天小余儿带你了解清楚!为什么要做V
  • 中国队提前包揽五项冠军!

  • WTT新加坡大满贯赛:马龙淘汰巴西名将 国乒提前包揽五冠世界乒乓球职业大联盟(WTT)新加坡大满贯赛即将再现中国队包揽五项冠军的盛况——在18日结束的男子单打半决赛中,奥运冠军

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • UUID的弊端以及雪花算法

  • 一、问题为什么需要分布式全局唯一ID以及分布式ID的业务需求在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识如在美团点评的金融、支付、餐饮、酒店;猫眼电影等