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的属性自动装配.在大多数情况下 ...
随机推荐
- JAVAEE学习day04方法的定义和重载
1.方法定义的格式 方法就是完成特定功能的代码块 修饰符 返回值类型 方法名(参数类型 参数名1, 参数类型 参数名2...){ 方法体; return 返回值; } 修饰符: 初学者只需记住publ ...
- 题解 UVA12186 【工人的请愿书 Another Crisis】
俺太难了 记录一下我调了一个小时的错误 多测不清空 多测清空只清空了\(vector\) 多测全清空了,但是忘了清空\(vector[0]\) \(priority\)_ \(queue\)把\(gr ...
- [BUG]Uncaught TypeError: Illegal invocation at HTMLDivElement.
<div id="clickMe" key="1">点我</div> clickMe.onclick = function (event ...
- Linux nginx安装步骤 centos7
1.安装依赖: yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel 2.创建一个文件夹cd /usr/localmk ...
- ArchLinux - 脚本安装使用指南
前面不想废话,讲什么脚本说明,功能什么的!只讲使用方法,其他的可以去Gitee看,去Github看. 脚本虽然支持Boot和UEFI,但是我打算一起讲,因为它们安装时的区别,只有3处不同. 第一步 先 ...
- Journal of Proteome Research | iHPDM: In Silico Human Proteome Digestion Map with Proteolytic Peptide Analysis and Graphical Visualizations(iHPDM: 人类蛋白质组理论酶解图谱的水解肽段分析和可视化展示)| (解读人:邓亚美)
文献名:iHPDM: In Silico Human Proteome Digestion Map with Proteolytic Peptide Analysis and Graphical Vi ...
- Journal of Proteome Research | Clinically Applicable Deep Learning Algorithm Using Quantitative Proteomic Data (分享人:翁海玉)
题目:Clinically Applicable Deep Learning Algorithm Using Quantitative Proteomic Data 期刊:Journal of Pro ...
- Ubuntu16.04安装QQ机器人
Ubuntu安装QQ机器人 看了看现在QQ机器人似乎只有酷Q机器人有Docker可以在linux上运行了 那就k开始装酷Q机器人,资源占用也不是很大,大概占用180M内存吧 安装酷Q HTTP 首先安 ...
- MassDNS:跨域DNS枚举工具
MassDNS:跨域DNS枚举工具 simeon 原文地址:http://offsecbyautomation.com/Use-MassDNS/ 工具地址:https://github.com/ble ...
- [dp]牛牛与数组
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 牛牛喜欢这样的数组: 1:长度为n 2:每一个 ...