Spring中的注解之@Override和@Autowired
作者:天猫精灵998 发布时间:2022-08-07 19:56:47
一、Override
首先,@Override
注解是伪代码,表示子类重写父类的方法。这个注解不写也是可以的,但是写了有如下好处:
1. 可以当注释用,方便阅读(注解很重要的一个作用就是注释);
2. 编译器和 IDE 可以验证 @Override
下面的方法名是否是父类中所有的,如果没有的话就会报错。如果没有加 @Override
,而子类中的方法名又写错了,这个时候编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
下面来验证一下,首先有一个 IPay
的父类,包含一个 toPay
方法,然后 WeChatPay
子类继承了 IPay
类,里面重写了父类的 toPay
方法。
public class WeChatPay extends IPay {
@Override
public void toPay() {
System.out.println("开始微信支付");
}
public static void main(String[] args) {
WeChatPay weChatPay = new WeChatPay();
weChatPay.toPay();
}
}
class IPay {
public void toPay() {
System.out.println("开始支付");
}
}
我们来执行下 WeChatPay
中的 main
方法,输出内容如下:
开始微信支付
现在我们把父类中的 toPay
方法名改掉,可以看到代码还没执行,IDE 就有错误提示了:
如果执行上面的代码,编译器会直接报错,这是因为 toPay
方法在父类中不存在:
java: 方法不会覆盖或实现超类型的方法
这时候如果把 @Override
注解去掉,编译是可以通过的,编译器会认为是子类中定义了一个新方法:
二、Autowired
@Autowired
顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。@Autowired
是 Spring 自带的注解,通过 AutowiredAnnotationBeanPostProcessor
类实现的依赖注入。
将@autowored写在被注入的成员变量上,就不用再xml文件中配置了,在程序中去掉相应的setter和getter方法
下面用代码测试一下:
interface IPay {
String pay();
}
@Service
class Alipay implements IPay {
@Override
public String pay() {
return "发起支付宝支付";
}
}
@Service
public class PayService {
@Autowired
private Alipay alipay;
public String toPay() {
return alipay.pay();
}
}
个人理解,@Autowired
就是自动装箱机制。Alipay
里面的 pay
是实例方法,如果想要调用它,就必须创建一个 alipay
对象,然后通过这个对象去调用。@Autowired
等效于下面的代码:
public class PayService {
public String toPay() {
Alipay alipay = new Alipay();
return alipay.pay();
}
}
使用
@Autowired
注入,代码看起来简洁了很多
测试一下,如果把 @Autowired
注释掉看看会怎样:
哦吼,报错了!这说明 @Autowired
被注释掉之后, alipay
没有装箱,还只是一个初始值 null
,因此无法调用 pay
方法:
有几个地方需要注意下,@Autowired
必须用在 Spring bean 里面,也就是说类的外面必须要加 @Service
、@Component
等注解,让这个类变成 bean ,不然就会报错:
此外,如果是 SpringBoot 应用,@Controller
和 @RestController
也是一个合法的 Spring bean:
@RestController
@RequestMapping("pay")
public class PayService {
@Autowired
private Alipay alipay;
@GetMapping("alipay")
public String toPay() {
return alipay.pay();
}
}
有 @RestController 就不用加 @Service 了
还有一个注意点,需要自动装配的类,本身也必须是 Spring bean,也就是说前面要加 @Service
,不然 @Autowired
无法注入。
现在代码可以正常运行,但是 @Autowired
还是有警告,如下图所示:
我们知道依赖注入有三种方式:
变量(filed)注入
@Autowired
private JavaMailSender mailSender;
构造方法注入
final JavaMailSender mailSender;
public IMailServiceImpl(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
set方法注入
private JavaMailSender mailSender;
@Autowired
public void setJavaMailSender (JavaMailSender mailSender) {
this.mailSender = mailSender;
}
其中第一种变量注入是不推荐的,原因可以看一下这篇文章: @Autowired(required=false)注入注意的问题
来源:https://blog.csdn.net/weixin_43487782/article/details/116270383


猜你喜欢
- 我就废话不多说了,大家还是直接看代码吧~using UnityEngine;using UnityEngine.EventSystems;
- 1. 前言前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Secu
- 一、File类的概述和构造方法public class Fileextends Objectimplements Serializable,
- 做多媒体项目时,经常会最后来个客户签名并保存之类的,签名保存之前的博客Unity3d截图方法合集有介绍过了,今天闲着把断笔写字的也贴出来吧,
- 1、Redis 怎么保证高可用、有哪些集群模式主从复制、哨兵模式、集群模式。2、主从复制在当前最新的 Redis 6.0 中,主从复制的完整
- 1.把springboot项目打包成三个jar包,并指定端口为14341,14342,143432.下载腾讯云免费ssl证书,解压后会出现如
- 在日常开发过程中,偶尔会出现一些极端问题。比如 网络重复请求,很难过滤 请求的问题。下面一段代码,可以解决这个重复请求的问题。下面上一段代码
- 数组的定义数组本质上就是让我们能 " 批量 " 创建相同类型的变量。数组的三种语法格式1、 数据类型 [] 数组名称 =
- 在一些项目的实际开发过程中,我们有时候需要对GridControl中列值进行转义,譬如1转义成“完成”等等,一般在诸如CustomColum
- DataGridView:显示数据表后台数据绑定:List<xxx> list = new List<xxx>();
- 以前只知道控件的onTouchEvent()事件,它的动作有MotionEvent.ACTION_DOWN、MotionEvent.ACTI
- 前言小小知识,不值一提,了解了也不能让你提高身价,但是不了解你就是比别人少知道点!事儿就是这么个事儿,直接正题吧! 直接看代码演示优先级当方
- Java是一种面向对象的编程语言,由Sun Microsystems公司在1995年的时候正式发布。直到今天,Java都一直是最受欢迎的编程
- 上一篇我们学习了自定义ViewGroup的基本步骤,并做了一个CustomGridLayout的实例,这篇我们继续来说说自定义ViewGro
- 一、多媒体应用架构1.1 音视频传统应用架构通常,传统的播放音频或视频的多媒体应用由两部分组成:播放器:用于吸收数字媒体并将其呈现为视频和/
- Java游戏俄罗斯方块的实现实例 java小
- 前言翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来。当然现在看来,里面有很多的不足之处,但因博主现在已
- 〇、正则表达式的基本语法符号若只简单匹配固定字符串,则无需任何修饰符,例如:需要匹配字符串 77,则可直接写:new Regex(
- 要说哪门后端语言的语法优雅,那就不得不提C#,而在我看来,LINQ语法可以说是其优雅的重要一环!通常后端从数据库查询出来的数据并不是直接返回
- 本文实例讲述了Java中的异常和处理机制。分享给大家供大家参考,具体如下:简介程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期