Spring-自动装配

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
Spring中实现自动装配的方式

(1)通过XML文件。

(2)通过注解

既然有自动装配,就说明有手动装配,什么是手动装配呢?下面用一个例子来解释:

1.1 手动装配


实体类Book:

public class Book {

private int id;

private String name;

//get,set,有参构造,无参构造

}

实体类Teacher:

public class Teacher {

private int id;

private String name;

//get,set,有参构造,无参构造

}

实体类:Student

public class Student {

private String name;

private Teacher teacher;

private Book book;

//get,set,有参构造,无参构造

}

XML配置:

可以看到,我们配置Student这个Bean时,是需要我们手动地将Book和Teacher进行装配进去的,这种方式就是手动装配

二、自动装配

======

接下来开始讲自动装配

2.1通过XML文件


其种类有:

(1)byName根据属性名称自动注入

(2)   byType根据属性类型自动注入

2.1.1 byName根据属性名称自动注入

注意看student,这时并不需要进行手动装配Book和Teacher了。

实现机制

第一步:Spring会根据class属性找到实体类

第二步:查询实体类中所有set方法的名字

第三步:根据set方法后面的名字,首字母小写(如setBook(),那其后面名字为book)

第四步: 根据这个名字,再到配置文件中寻找一个与该名字相同id的Bean,注入进来。

也就是说如果在配置文件中查找不到你的set方法后面的名字并且没有相应的类型(唯一),那么就无法完成注入

2.1.2  byType根据属性类型自动注入

XML配置文件:

注意

(1)根据需要注入的属性的类型来完成对属性的注入,并不对bean的id作要求

(2)同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常,因为其是根据类型来注入的,多个相同类型Spring就不知道需要注入哪一个了。

2.2 通过注解实现


注解是通过反射来实现的。

准备工作

(1)在spring配置文件中引入context文件头

xmlns:context=“http://www.springframework.org/schema/context”

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context.xsd

(2)开启属性注解支持

必须要写在xml中,这是用来开启注解的支持,如果不加上注解就无效。

context:annotation-config/

2.2.1 @Autowired

XML文件

注解实现

public class Student {

private String name;

@Autowired

private Teacher teacher;

@Autowired

private Book book;

//set,get,有参构造,无参构造

}

在实体类的对应属性上添加@Autowired注解(也可以把注解放到对应属性的set方法上)

注解方法装配属性过程:

(1)spring会默认优先根据(被注解修饰的)属性类型去容器中找对应的组件(bean),找到就赋值;

(2)若找到多个相同类型的组件,再将属性的名称作为组件(bean)的id去容器中查找。

扩展

@Autowired(required=false)  说明:

**false:**对象可以为null;等于告诉 Spring:在找不到匹配 Bean 时也不报错。

true:对象必须存对象,不能为null。

注意:当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用@Autowired(required= false)。这等于告诉 Spring:在找不到匹配 Bean 时也不报错。

2.2.2 @Qualifier注解

注意:不可以单独使用

可以和使用Autowired搭配使用:@Qualifier指定需要装配的组件的id,而不是使用属性名

如下,spring就会优先在容器中查找id为bean1的组件。

public class Student {

private String name;

@Autowired

@Qualifier(“bean1”)

private Teacher teacher;

@Autowired

private Book book;

//set,get,有参构造,无参构造

}

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

一线互联网P7面试集锦+各种大厂面试集锦

学习笔记以及面试真题解析

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
g name;

@Autowired

@Qualifier(“bean1”)

private Teacher teacher;

@Autowired

private Book book;

//set,get,有参构造,无参构造

}

线程、数据库、算法、JVM、分布式、微服务、框架、Spring相关知识

[外链图片转存中…(img-V64vSYGZ-1714663062337)]

一线互联网P7面试集锦+各种大厂面试集锦

[外链图片转存中…(img-2YttlVNv-1714663062337)]

学习笔记以及面试真题解析

[外链图片转存中…(img-x2IvWF77-1714663062337)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

  • 13
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值