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

news/2024/12/29 9:41:01/

# 问题原因

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

1.初始化问题

先看一下Java初始化类的顺序:父类的静态字段 > 父类静态代码块 > 子类静态字段 > 子类静态代码块 > 父类成员变量 > 父类构造代码块 > 父类构造器 > 子类成员变量 > 子类构造代码块 > 子类构造器。

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

2.对IOC容易依赖过强

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

3.其他方面

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

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

# 其他使用方式

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

set方法

@RestControllerpublic 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注入一样作用于成员变量上。

构造器

@RestControllerpublic class TestController1 {    ITestService testService;    /*    * 基于构造方法的注入    * */    public TestController1(ITestService iTestService) {        this.testService = iTestService;    }    @GetMapping("/status1")    public Result<?> status() {        return testService.status();    }}

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

构造器的简化版(推荐)

首先,需要引入lombok依赖。

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

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

@RestController@RequiredArgsConstructorpublic class TestController3 {    /*     * 用@RequiredArgsConstructor注解,这个使用方式也可以应用于service层     * */    private final ITestService testService;    @GetMapping("/status3")    public Result<?> status() {        return testService.status();    }}

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

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

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

# 总结

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


http://www.ppmy.cn/news/826814.html

相关文章

调试工具_gdb使用教程

目录 一. 环境介绍 二. gdb指令 1. 启动调试 2. 退出调试 3. 查看代码 4. 运行程序 5. 打断点 6. 查看断点 7. 删除断点 8. 逐过程调试 9. 逐语句调试 10. 查看变量 11. 常显示变量&#xff08;监视&#xff09; 12. 取消常显示变量 13. 运行到指定行 14. 执…

2022年低压电工考试试题模拟考试平台操作

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2022低压电工考试题是低压电工题库上机考试练习题&#xff01;2022年低压电工考试试题模拟考试平台操作依据低压电工考前押题。低压电工练习题通过安全生产模拟考试一点通模拟在线真实考试。 1、【单选题】( )仪表由固…

2021年中式面点师(高级)报名考试及中式面点师(高级)模拟试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 中式面点师&#xff08;高级&#xff09;报名考试根据新中式面点师&#xff08;高级&#xff09;考试大纲要求&#xff0c;安全生产模拟考试一点通将中式面点师&#xff08;高级&#xff09;模拟考试试题进行汇编&…

397种生活小窍门

397种生活小窍门 吸收别人的经验 类别&#xff1a;生活 | 浏览(39) | 2008-5-23 14:54:07 | 关闭广告 1 、巧用牙膏 6:若有小面积皮肤损伤或烧伤、烫伤&#xff0c;抹上少许牙膏&#xff0c;可立即止血止痛&#xff0c;也可防止感染&#xff0c;疗效颇佳。 2 、巧除纱窗…

尚硅谷Docker实战教程-笔记12【高级篇,Docker-compose容器编排】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址&#xff1a;尚硅谷Docker实战教程&#xff08;docker教程天花板&#xff09;_哔哩哔哩_bilibili 尚硅谷Docker实战教程-笔记01【基础篇&#xff0c;Docker理念简介、官网介绍、平台入门图解、平台架构图解】…

小常识

1吹风机对着标签吹&#xff0c;等吹到标签的胶热了&#xff0c;就可以很容易的把标签撕下来了 2喝茶以后&#xff0c;杯子里面留下难看的茶渍&#xff0c;用牙膏洗茶渍&#xff0c;非常干净 3刚刚被蚊子咬完的时候涂上肥皂就不会痒了&#xff0c;我一直这么做 4旅行带衣服如…

日常生活小常识100条

生活中的小事情往往能带给我们意想不到的效果,相信每个人都能有用。 1 、巧用牙膏:若有小面积皮肤损伤或烧伤、烫伤&#xff0c;抹上少许牙膏&#xff0c;可立即止血止痛&#xff0c;也可防止感染&#xff0c;疗效颇佳。 2 、巧除纱窗油腻:可将洗衣粉、吸烟剩下的烟头一起放在水…

LeetCode20.有效的括号

20.有效的括号 文章目录 20.有效的括号一、题目二、题解算法思路具体实现算法分析 一些拓展1、栈数据结构的应用2、括号匹配问题的其他解法3、括号匹配问题的变种&#xff1a; 一、题目 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的…