@Autowired注解详解——超详细易懂
详解 详细 注解 易懂 Autowired
2023-09-11 14:17:51 时间
@Autowired详解
要搞明白@Autowired注解就是要了解它是什么?有什么作用?怎么用?为什么?
- 首先了解一下IOC操作Bean管理,bean管理是指(1)spring创建对象 (2)spring注入属性。当我们在将一个类上标注@Service或者@Controller或@Component或@Repository注解之后,spring的组件扫描就会自动发现它,并且会将其初始化为spring应用上下文中的bean。 而且初始化是根据无参构造函数。先看代码来体会一下这个注解的作用,测试代码如下:(@Data注解是由Lombok库提供的,会生成getter、setter以及equals()、hashCode()、toString()等方法)
@Data
@Service
public class AutoWiredBean {
private int id;
private String name;
public AutoWiredBean(){
System.out.println("无参构造函数");
}
public AutoWiredBean(int id, String name) {
this.id = id;
this.name = name;
System.out.println("有参构造函数");
}
}
在springboot项目的测试类中进行测试,代码如下
@SpringBootTest
@RunWith(SpringRunner.class)
class Springboot02WebApplicationTests {
private AutoWiredBean autoWiredBean;
@Autowired
public Springboot02WebApplicationTests (AutoWiredBean autoWiredBean){
this.autoWiredBean = autoWiredBean;
}
@Test
void contextLoads() {
System.out.println(autoWiredBean);
System.out.println(autoWiredBean.getId()); //0
System.out.println(autoWiredBean.getName()); //null
}
}
控制台输出的结果如下:
将下面代码注释了在运行
/* @Autowired
public Springboot02WebApplicationTests (AutoWiredBean autoWiredBean){
this.autoWiredBean = autoWiredBean;
}*/
输出结果如下:
从这我们可以看到无论有没有使用AutoWiredBean 类,它都被spring通过无参构造函数初始化了。当将被使用时才会创建。
进入正题它有什么用?
@Autowired可以标注在属性上、方法上和构造器上,来完成自动装配。默认是根据属性类型,spring自动将匹配到的属性值进行注入,然后就可以使用这个属性(对Springboot02WebApplicationTests类来说)autoWiredBean对象的方法。
怎么用?
它可以标注在属性上、方法上和构造器上,那有什么区别吗?简单来说因为类成员的初始化顺序不同,静态成员 ——> 变量初始化为默认值——>构造器——>为变量赋值。如果标注在属性上,则在构造器中就不能使用这个属性(对象)的属性和方法。
推荐: 对构造函数标注注解,如图在构造器上标注@Autowired注解
当标注的属性是接口时,其实注入的是这个接口的实现类, 如果这个接口有多个实现类,只使用@Autowired就会报错,因为它默认是根据类型找,然后就会找到多个实现类bean,所有就不知道要注入哪个。然后它就会根据属性名去找。所以如果有多个实现类可以配合@Qualifier(value=“类名”)来使用 (是根据名称来进行注入的)可以参考 spring@Autowired注解的注入规则
有些地方可能表述不清望包涵,望指出。我会马上改正
相关文章
- eclipse下载与安装步骤详解,包含解决错误(最全最详细,多图)
- java中PipedStream管道流通信详细使用(详解)
- java中Dateformat类的详细使用(详解)
- 详解MYSQL数据库密码的加密方式及破解方法
- struts2基本配置详解
- phpExcel常用方法详解【附有php导出excel加超级链接】
- .Net使用RabbitMQ详解
- Extjs MVC开发模式详解
- SQL盲注详解
- ELK详解(五)——Head插件简单使用
- MySQL数据库检查修复详解
- SQL语句详解(三)——SQL子查询
- Linux shell test命令用法详解
- 【网址收藏】linux wget 命令常用参数用法详解(附实例说明)
- Python语言学习:Python语言学习之文件读取&写入/操作系统(OS模块详解)的简介、案例应用之详细攻略
- NLP之Transformer:Transformer架构详解之Encoder(位置编码/多头注意力/Position-Wise前馈网络/层归一化)、Decoder(Masked多头注意力)之详细攻略
- Python之pandas:pandas中缺失值与空值处理的简介及常用函数(drop()、dropna()、isna()、isnull()、fillna())函数详解之详细攻略
- DL之Transformer:Transformer的简介(优缺点/架构详解,基于Transformer的系列架构对比分析)、使用方法(NLP领域/CV领域)、案例应用之详细攻略
- DL之MTCNN:MTCNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之R-FCN:R-FCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之YoloV2:Yolo V2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之PSPNet:PSPNet算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之DSSD:DSSD算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- NLP之Transformer:Transformer架构详解之Encoder(位置编码/多头注意力/Position-Wise前馈网络/层归一化)、Decoder(Masked多头注意力)之详细攻略
- DL之SPP-Net:SPP-Net算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之MobileNetV2:MobileNetV2算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之NIN:Network in Network算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- DL之R-CNN:R-CNN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
- Computer:字符编码(ASCII编码/GBK编码/BASE64编码/UTF-8编码)的简介、案例应用(python中的编码格式及常见编码问题详解)之详细攻略
- 【最全最详细springboot注解】@RestController 详解
- 第11篇 基础 (十一)详解Line Edit:行编辑
- 分布式系统实践解读丨详解高内聚低耦合
- Android SystemProperties系统属性详解
- bicabo C#多线程详解(三)
- Weka Explorer(探索者界面) 详解(4)logistic回归和回归算法
- 【Bootstrap】bootstrap入门之Scss知识点详解_03
- r n 回车换行符详解