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的属性自动装配.在大多数情况下 ...
随机推荐
- DataFrame简介(一)
1. DataFrame 本片将介绍Spark RDD的限制以及DataFrame(DF)如何克服这些限制,从如何创建DataFrame,到DF的各种特性,以及如何优化执行计划.最后还会介绍DF有哪些 ...
- CentOS7采用tar.gz包方式安装Mysql5.7
软件:VMware Linux版本:CentOS 7 一.安装mysql(采用tar.gz包安装Mysql5.7) 1.安装开发工具包 [root@localhost ~]# yum groups m ...
- 「踩坑记」Android API 判断权限申请结果的闪退问题
这几天尝试着用Android Studio写一个小工具的时候遇到了一个动态权限申请的问题.权限的申请使用的语句为: ActivityCompat.requestPermissions(this, ne ...
- vmware导入ova文件踩坑记
问题来源 众所周知,所有的网络行为都会产生相应的网络流量,那么所有的网络攻击行为也有其对应的流量特点,那么是否能根据流量特点进而分析出其对应的是什么攻击行为呢? 我在虚拟机上使用vulnhub的靶场环 ...
- c# 使用Newtonsoft.Json解析JSON数组
一.获取JSon中某个项的值 要解析格式: [{"VBELN":"10","POSNR":"10","RET_ ...
- 深入理解JAVA字符串常量池
初学JAVA时,在学习如何比较两个字符串是否相等,大量资料告诉我,不能用等于号( = )去比较,需要使用equals方法,理由是String是一个对象,等号此时比较的是两个字符串在java内存堆中的地 ...
- CDNbest-设置不缓存
写在开始之前 有时候根据业务需求,我们网站不需要缓存,这时候就需要设置下 让网站不走缓存 步骤一 登录平台找到我们的站点->站点设置->缓存设置 如图 备注:填写需要操作的域名,时间为&q ...
- Visual Studio2019+OpenCV3.4.9环境搭建
让人头疼的vs2019+opencv环境配置 准备: visual studio2019: opencv 3.4.9: 耐心: 说明:vs2019属性管理器没有Microsoft.Cpp.x64.us ...
- [BFS]Codeforces Igor In the Museum
Igor In the Museum time limit per test 1 second memory limit per test 256 megabytes input standard ...
- OpenCV-Python 理解特征 | 三十六
目标 在本章中,我们将尝试理解什么是特征,为什么拐角重要等等 解释 你们大多数人都会玩拼图游戏.你会得到很多小图像,需要正确组装它们以形成大的真实图像.问题是,你怎么做?将相同的理论投影到计算机程序上 ...