Spring 中的自动装配
目录
- 1. 前言
- 1.1 Spring 的装配机制
- 1.2 自动配置的两种方式
- 2. 利用注解实现自动配置
- 2.1 @Autowired
- 2.2 @Qualifier
- 2.3 @Resource
- 3. 总结
1. 前言
1.1 Spring 的装配机制
自动装配指使用 Spring 满足 Bean 依赖的一种方法,Spring 会在应用上下文中为某个 Bean 寻找其依赖的 Bean,主要有三种装配机制:
- XML 中显式配置;
- Java 中显式配置;
- 隐式的 Bean 发现机制和自动装配;
而 Spring 的自动装配主要从两方面来实现:
- 组件扫描:Component Scanning,Spring 自动发现应用上下文中所创建的 Bean。
- 自动装配:Autowiring,Spring 自动满足不同 Bean 之间的依赖,即 IoC/DI.
1.2 自动配置的两种方式
- byName
<bean id="user" class="com.cunyu.pojo.User" autowire="byName">
<property name="name" value="村雨遥"/>
</bean>
按名称自动装配,在配置 Bean 时,加入一个 autowire
属性值 byName
。此时,Spring 将先去查找类中所有的 Setter
方法,然后去 Spring 容器中寻找是否有该字符串名称 id
的对象相匹配,如果找到了,就取出注入;若是没有找到,那么就报空指针异常。
- byType
按类型自动装配,在配置 Bean 时,加入一个 autowire
属性值 byType
。此时需要有一个 前提条件:同一类型的对象,在 Spring 容器中有且只有一个,否则就会报错。此时,Spring 将去查找类中所有的 Setter
方法,然后在 Spring 容器查找是否有该字符串名称 id
的对象,找到匹配的对象就取出注入,否则就抛出空指针异常。
2. 利用注解实现自动配置
2.1 @Autowired
@Autowired
按照类型(byType
)自动配置,不支持 id
匹配。
- 去掉
set
方法,利用@Autowired
进行注解;
public class User{
@Autowired
private Address address;
public Address getAddress(){
return address;
}
}
- 配置 Spring 配置文件;
<context:annotation-config/>
<bean id="addr" class="com.cunyu.pojo.Address"/>
<bean id="user" class="com.cunyu.pojo.User"/>
2.2 @Qualifier
@Qualifier
不能单独使用,需要配合 @Autowired
使用,从而实现按名称(byName
)自动配置。
- 在属性中添加
@Qualifier
public class User{
@Autowired
@Qualifier(value="addr2")
private Address address;
public Address getAddress(){
return address;
}
}
- 配置 Spring 配置文件;
<context:annotation-config/>
<bean id="addr" class="com.cunyu.pojo.Address"/>
<bean id="addr2" class="com.cunyu.pojo.Address"/>
<bean id="user" class="com.cunyu.pojo.User"/>
2.3 @Resource
@Resource
默认按照名称 byName
的方式进行装配,但如果有指定的 name
属性,则 优先 按照指定属性进行 byName
的方式查找并装配。
- 优先
byName
- 属性配置
@Resource
public class User{
// 指定 name 属性,先按照该属性进行按名称自动装配
@Resource(name = "addr2")
private Address address;
}
- 配置 Spring 配置文件
<context:annotation-config/>
<bean id="addr" class="com.cunyu.pojo.Address"/>
<bean id="addr2" class="com.cunyu.pojo.Address"/>
<bean id="user" class="com.cunyu.pojo.User"/>
- 默认
byType
- 属性配置
@Resource
public class User{
// 先 byName 查找失败,然后 byType 查找成功
@Resource
private Address address;
}
- 配置 Spring 配置文件
<context:annotation-config/>
<bean id="addr" class="com.cunyu.pojo.Address"/>
<bean id="user" class="com.cunyu.pojo.User"/>
3. 总结
@Autowired
和 @Resource
两者的作用相同,都是利用注解方式注入对象,均支持装配 Bean,都可以写在字段上,或者写在 setter
方法上。
@Autowired
属于 Spring 规范,默认按类型(byType
)装配,默认情况下要求依赖对象必须存在。若要允许 null
,则可设置其 required = false
,若想要按名称(byName
)装配,则可以搭配 @Qualifier
共同使用。
@Resource
属于 J2EE 规范,默认按名称(byName
)装配,名称可以通过 name
属性来指定。如果没有 name
属性,则当该注解写在 字段 上时,默认 取字段名 进行按名称(byName
)查找,如果注解写在 setter 方法 上,则默认取 属性名 进行装配。当找不到与名称匹配的 Bean 时才按类型(byType
)装配。但是需要注意的是,如果 name
属性一旦指定,就只会按照名称进行装配。
两者执行顺序不同,@Autowired
优先 byType
,若要实现 byName
,需要搭配 @Qualifier
,而 @Resource
优先 byName
,找不到匹配的 Bean 时,再 byType
。
- 一次通过漏洞挖掘成功渗透某网站的过程
- 使用fuzzDB进行web安全测试
- Android Material Design系列之FloatingActionButton和Snackbar
- Fluent Nhibernate之旅(五)--利用AutoMapping进行简单开发
- Android Material Design系列之Toolbar
- Struts2 S2-020在Tomcat 8下的命令执行分析
- Struts2再曝S2-020补丁绕过漏洞 – 万恶的正则表达式
- 学习BlogEngine.Net解读笔记系列(一)
- Android面试系列之应用内多语言切换
- Android面试系列之AsyncTask
- Kali-Linux扩充弹药:Kali Linux metapackages
- 使用HackRF解调TDD-LTE信号
- 一个优秀的Android应用从建项目开始
- Ruby OpenSSL 私钥伪造脚本
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 爆破cobalt strike密码脚本
- 第003课 linux入门命令详解
- 第004课 vi编辑器的使用详解
- 【前端JQ】jQuery赋值checked的几种写法,attr()方法不好使,建议使用prop()方法。
- 达梦数据库适配问题
- Angular Component UI单元测试的隔离策略
- 第005课 linux进阶命令(文件查找,文件解压操作详解)
- 没有这 29 款插件的 Chrome 是没有灵魂的
- 第006课 开发板熟悉与体验
- Angular Observable数据类型的单元测试数据准备
- 第007课 裸机开发步骤和工具使用(SourceInght NotePad++使用)
- Angular jasmine.expect单步调试
- 第008课 第1个ARM裸板程序及引申(点亮LED灯)
- SharedPreferences VS MMKV
- 第009课 gcc和arm-linux-gcc和Makefile