Spring(三):bean的自动装配
Bean的自动装配
自动装配是Spring满足bean依赖的一种方式。
Spring会在上下文中自动寻找,并自动给bean装配属性
Spring中三种装配方式
在xml中显式的配置。
在java中显式的配置
隐式的自动装配bean
java中显式的配置
环境搭建
cat
package com.rzp.pojo;
public class Cat {
public void shout(){
System.out.println("meow~");
}
}
dog
package com.rzp.pojo;
public class Dog {
public void shout(){
System.out.println("wang!");
}
}
people
package com.rzp.pojo;
public class People {
private Cat cat;
private Dog dog;
private String name;
@Override
public String toString() {
return "People{" +
"cat=" + cat +
", dog=" + dog +
", name='" + name + '\'' +
'}';
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public Dog getDog() {
return dog;
}
public void setDog(Dog dog) {
this.dog = dog;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ByName自动装配
xml
在bean中设置autowire为byName
实例化对象的时候会自动在上下文中查找和自己对象set方法后面的值对应的beanId
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog" class="com.rzp.pojo.Dog"/>
<!--会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId-->
<bean id="people" class="com.rzp.pojo.People" autowire="byName">
<property name="name" value="rzp"/>
</bean>
</beans>
比如people有setCat方法,就会在上下文中找id为cat的对象,并自动注入。
测试类
public class Mytest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
People people = context.getBean("people", People.class);
people.getDog().shout();
people.getCat().shout();
}
}
因此如果把dog的id修改后,就不能注入了。
<bean id="dog1" class="com.rzp.pojo.Dog"/>
ByType自动装配
在bean中设置autowire为byType
实例化对象的时候会自动在上下文中查找和自己对象set方法相同的对象
这种情况想完全只看类型,可以不写类的名字。
<bean class="com.rzp.pojo.Dog"/>
<!--会自动在容器上下文查找,和自己对象set方法后面的值对应的beanId-->
<bean id="people" class="com.rzp.pojo.People" autowire="byName">
<property name="name" value="rzp"/>
</bean>
测试:Dog也被注入到people中去了
但是如果people中有多个Dog就会报错。
总结
ByName:保证bean的id唯一,而且和注入的set方法值一致。
ByType:保证bean的class唯一,并且和注入的类型一致。
注解自动装配
The introduction of annotation-based configuration raised the question of whether this approach is “better” than XML. ----使用注解比xml更好。
使用注解:
注意aop这个包导入成功
导入约束
xmlns:context="http://www.springframework.org/schema/context"
配置注解的支持
<context:annotation-config/>
基本格式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config/>
</beans>
在bean的属性上增加@Autowired注解,spring会自动根据id在xml文件中查找,找不到就找唯一的同类,如果也没有就会报错。
这种情况还可以增加Qualifier注解指定id的名字
示例
public class People {
@Autowired
private Cat cat; //使用注解以后,set方法也可以不需要
@Autowired
private Dog dog;
private String name;
.....
xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解的支持-->
<context:annotation-config/>
<bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog" class="com.rzp.pojo.Dog"/>
<bean id="people" class="com.rzp.pojo.People"/>
</beans>
使用Autowired,可以加在属性上面,也可以加在set方法上面。
使用Autowired和xml不同,不必要给set方法。
拓展
@Nullable 说明字段可以为空
@Autowired 可以输入参数
@Autowired(required=false)默认为true,如果设置为false,就允许为null(如果不允许为null,实例化会报错)
显式指定装配的
如果xml中有多个相同类的配置,可以增加Qualifier直接配置id
示例:
<bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog" class="com.rzp.pojo.Dog"/>
<bean id="dog1" class="com.rzp.pojo.Dog"/>
<bean id="people" class="com.rzp.pojo.People"/>
@Autowired
@Qualifier("dog")
private Dog dog;
使用Resource注解
Resource是Java提供的注解,不是spring的
<bean id="cat" class="com.rzp.pojo.Cat"/>
<bean id="dog31" class="com.rzp.pojo.Dog"/>
<bean id="dog1" class="com.rzp.pojo.Dog"/>
<bean id="people" class="com.rzp.pojo.People"/>
@Resource
private Cat cat;
@Resource(name = "dog1")
private Dog dog;
private String name;
Spring(三):bean的自动装配的更多相关文章
- Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配
一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...
- Spring学习03(Bean的自动装配)
6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...
- spring实战二之Bean的自动装配(非注解方式)
Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...
- Spring(三)之自动装配、表达式
自动装配 自动装配(autowire)协作者 Spring IoC容器可以自动装配(autowire)相互协作bean之间的关联关系.因此,如果可能的话,可以自动让Spring通过检查BeanFact ...
- Spring学习--xml 中 Bean 的自动装配
Spring IOC 容器可以自动装配 Bean. 只要在 <bean> 的 autowire 属性里指定自动装配的模式. byName(根据名称自动装配):必须将目标 Bean 的名称和 ...
- bean的自动装配,使用注解开发,使用java的方式配置Spring
bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...
- Spring bean的自动装配属性
bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...
- Bean的自动装配及作用域
1.XML配置里的Bean自动装配 Spring IOC 容器可以自动装配 Bean,需要做的仅仅是在 <bean> 的 autowire 属性里指定自动装配的模式.自动装配方式有: by ...
- Spring学习(六)-----Spring使用@Autowired注解自动装配
Spring使用@Autowired注解自动装配 在上一篇 Spring学习(三)-----Spring自动装配Beans示例中,它会匹配当前Spring容器任何bean的属性自动装配.在大多数情况下 ...
随机推荐
- [python]回答百度知道上的问题2000-2999之间的回文日
因为百度知道的编辑器没有提供代码功能,将回复写入. 题目如下: 求2000到2999的所有回文日,例如20200202 用Python怎么做 回文年好求,回文日的话,年月日这咋存啊 思路一:遍历每一天 ...
- 鸡汤 & 毒鸡汤
1.别低估任何人. 2.你没那么多观众,别那么累. 3.温和对人对事.不要随意发脾气,谁都不欠你的. 4.现在很痛苦,等过阵子回头看看,会发现其实那都不算事. 5.和对自己有恶意的人绝交.人有绝交,才 ...
- 人见人爱A-B 题解
参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算.(当然,大家都知道集合的定义,就是 ...
- 【Python】2.14&2.15学习笔记 运算符与表达式
太爽了,今天可以尽情熬夜了,明天不上课,可以学一整天\(Python\) 运算符 \(+,-,*,%\)就不说了,说几个和\(c\)不太一样的 除法 print( 5/3 ) 输出了\(1.66666 ...
- Deepin中安装使用好用的字典GoldenDict
2020-03-21 23:08:17 不说废话直接来安装步骤: 打开Deepin的应用商店,输入GoldenDict查找: 找到后点击安装,然后等待一小会,电脑提示音告诉你已经安装完成: 然后再 ...
- 记一次nor flash固件烧录速度优化
背景 某个方案使用的是spinor作为存储介质,每次烧录新固件都耗时数分钟,为了提高效率,需要对其进行优化. 分析流程 基本流程 当前烧录流程,有一个可选步骤,全盘擦除,这个步骤耗时达数分钟.不过这是 ...
- JDK14发布了,快来看看有什么新特性吧
序言
- 常用的 Git 命令与场景
Git 分布式版本控制系统 它拥有完整的版本控制功能,能够解决多人协作的问题 将自己的代码同步到 Github 上能够提升开发效率 git 会记录你每一次的版本修改操作 常用的 Git 操作 # 指定 ...
- VIM不正常退出产生的swp文件
VIM不正常退出产生的swp文件 当你非正常关闭vim编辑器时(比如直接关闭终端或者电脑断电),会生成一个.swp文件,这个文件是一个临时交换文件,用来备份缓冲区中的内容. 第一次产生的交换文件名为“ ...
- fastText 训练和使用
2019-09-09 16:33:11 问题描述:fastText是如何进行文本分类的. 问题求解: fastText是一种Facebook AI Research在16年开源的一个文本分类器. 其特 ...