Bean的自动装配
1、自动装配是Spring满足Bean依赖的一种方式
2、Spring会在上下文中自动寻找,并自动给Bean装配属性
Spring中bean有三种装配机制,分别是:

1 在xml中显式配置;

2 在java中显式配置;

3 隐式的bean发现机制和自动装配。【重要】
这里我们主要讲第三种:自动化的装配bean。

Spring的自动装配需要从两个角度来实现,或者说是两个操作:

组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;

组件扫描和自动装配组合发挥巨大威力,使得显示的配置降低到最少。

推荐不使用自动装配xml配置 , 而使用注解 .

测试环境搭建

1、新建一个项目

2、新建两个实体类,Cat Dog 都有一个叫的方法

public class Cat {public void shout() {System.out.println("miao~");}
}public class Dog {public void shout() {System.out.println("wang~");}
}

3、新建一个用户类 People

package com.xuyuan.Pojo;public class  People {private  Cat cat;
private  Dog dog;
private  String name;@Overridepublic 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;}
}

4、编写Spring配置文件

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People"><property name="name" value="徐源"/><property name="cat" ref="cat"/><property name="dog" ref="dog"/></bean>
</beans>

5、测试

import com.xuyuan.Pojo.People;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class mytest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = (People) context.getBean("people");people.getCat().shout();people.getDog().shout();}
}

结果正常输出,环境OK

byName自动装配

autowire byName (按名称自动装配)

由于在手动配置xml过程中,常常发生字母缺漏和大小写等错误,而无法对其进行检查,使得开发效率降低。

采用自动装配将避免这些错误,并且使配置简单化。

测试:

1、修改bean配置,增加一个属性 autowire=“byName”

 <?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People" autowire="byName"><property name="name" value="徐源"/></bean>
</beans>

2、再次测试,结果依旧成功输出!

3、我们将 cat 的bean id修改为 catXXX

4、再次测试, 执行时报空指针java.lang.NullPointerException。因为按byName规则找不对应set方法,真正的setCat就没执行,对象就没有初始化,所以调用时就会报空指针错误。
小结:

当一个bean节点带有 autowire byName的属性时。

将查找其类中所有的set方法名,例如setCat,获得将set去掉并且首字母小写的字符串,即cat。去spring容器中寻找是否有此字符串名称id的对象。如果有,就取出注入;如果没有,就报空指针异常。byType

autowire byType (按类型自动装配)

使用autowire byType首先需要保证:同一类型的对象,在spring容器中唯一。如果不唯一,会报不唯一的异常。

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="dogasfasfas" class="com.xuyuan.Pojo.Dog"/>
<!--
byname:会自动在容器的上下文中查找,和自己对象Set方法后的值对应 beanid
bytype:会自动在容器的上下文中查找,和自己对象属性类型方相同的bean
--><bean id="people" class="com.xuyuan.Pojo.People" autowire="byType"><property name="name" value="徐源"/></bean>
</beans>

NoUniqueBeanDefinitionException

测试:

1、将user的bean配置修改一下 : autowire=“byType”

2、测试,正常输出

3、在注册一个cat 的bean对象!

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>
<bean id="user" class="com.kuang.pojo.User" autowire="byType"><property name="str" value="qinjiang"/>
</bean>

4、测试,报错:NoUniqueBeanDefinitionException

5、删掉cat2,将cat的bean名称改掉!测试!因为是按类型装配,所以并不会报异常,也不影响最后的结果。甚至将id属性去掉,也不影响结果。

这就是按照类型自动装配!

使用注解

使用注解

jdk1.5开始支持注解,spring2.5开始全面支持注解。

准备工作:利用注解的方式注入属性。
导入约束 context约束
1、在spring配置文件中引入context文件头

<?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"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 开启注解的支持   -->
<context:annotation-config/><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People" autowire="byType"></bean>
</beans>

2、开启属性注解支持!【重点】

<context:annotation-config/>
@Autowired
直接在属性上使用即可  也可以在Set上使用
可以不使用Set方法 前提是你这个自动装配的属性在IOC(Spring)容器中存在且符合名字Byname
3、测试,成功输出结果!

测试:

1、将User类中的set方法去掉,使用@Autowired注解

public class People{@Autowiredprivate Cat cat;@Autowiredprivate Dog dog;private String str;public Cat getCat() {return cat;}public Dog getDog() {return dog;}public String getStr() {return str;}
}

2、此时配置文件内容

<?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"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- 开启注解的支持   -->
<context:annotation-config/><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People" autowire="byType"></bean>
</beans>

【科普时间】

@Nullable 字段标记了这个注解 可以为null但是不能为空 @Autowired(required=false)
说明:false,对象可以为null;true,对象必须存对象,不能为null。

//如果允许对象为null,设置required = false,默认为true
@Autowired(required = false)
private Cat cat;

如果@Autowired自动装配的环境比较复杂,自动装配无法通过一个注解【@Autowired完成时】我们可以使用@Qualifier(value=“×××”)去配合Autowired的使用 指定唯一的一个Bean注入
@Qualifier

@Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配@Qualifier不能单独使用。
测试实验步骤:

1、配置文件修改内容,保证类型存在对象。且名字不为类的默认名字!

<context:annotation-config/><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="cat111" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="dog222" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People" autowire="byName"></bean>

2、没有加Qualifier测试,直接报错

3、在属性上添加Qualifier注解

package com.xuyuan.Pojo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class  People {@Autowired@Qualifier(value ="cat111")
private  Cat cat;@Autowired@Qualifier(value ="dog222")
private  Dog dog;
private  String name;

测试,成功输出!
@Resource

@Resource如有指定的name属性,先按该属性进行byName方式查找装配;其次再进行默认的byName方式进行装配;如果以上都不成功,则按byType的方式自动装配。都不成功,则报异常。

实体类:

package com.xuyuan.Pojo;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;import javax.annotation.Resource;
import javax.annotation.Resources;public class  People {@Resource(name = "cat111")
private  Cat cat;@Resource(name = "dog222")
private  Dog dog;
private  String name;@Overridepublic 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;}
}

beans.xml

<context:annotation-config/><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="cat111" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="dog222" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People" autowire="byName"></bean>

测试:结果OK

配置文件2:beans.xml , 删掉cat2

<context:annotation-config/><bean id="cat" class="com.xuyuan.Pojo.Cat"/><bean id="dog" class="com.xuyuan.Pojo.Dog"/><bean id="people" class="com.xuyuan.Pojo.People" autowire="byName"></bean>
</beans>

实体类上只保留注解

public class  People {@Resource
private  Cat cat;@Resource
private  Dog dog;
private  String name;

结果:OK

结论:先进行byName查找,失败;再进行byType查找,成功。
小结

@Autowired与@Resource异同:

1、@Autowired与@Resource都可以用来装配bean。都可以写在字段上,或写在setter方法上。

2、@Autowired默认按类型装配(属于spring规范),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用

3、@Resource(属于J2EE复返),默认按照名称进行装配,名称可以通过name属性进行指定。如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

它们的作用相同都是用注解方式注入对象,但执行顺序不同。@Autowired先byType,@Resource先byName。

Spring-04 Bean的自动装配相关推荐

  1. Spring之Bean的自动装配

    Spring从入门到精通–(4)Spring之Bean的自动装配 作者:进击攻城狮 个人主页:欢迎访问我的主页 首发时间:2022年8月5日星期五 订阅专栏:Spring入门到精通 个人信条:星光不问 ...

  2. Spring之 Bean的自动装配

    什么是Spring Bean的自动装配? 自动装配是Spring满足bean依赖一种方式 Spring会在上下文种自动寻找,并自动给bean装配属性 Spring种有三种装配方式 1.在xml种显示配 ...

  3. 详解Spring中Bean的自动装配~

    目录 1. 环境搭建 2. byName.byType 3. 使用注解实现自动装配 @Autowired @Resource 小结 自动装配是Spring满足bean依赖的一种方式 Spring会在上 ...

  4. Spring的Bean的自动装配属性autowire

    Spring自动注入 使用元素的 autowire 属性为一个 bean 定义指定自动装配模式 autowire设置值 no:没开启 byName: 根据bean的id名称,注入到对应的属性里面 by ...

  5. 请解释Spring Bean 的自动装配?

    在Spring 框架中,在配置文件中设定bean 的依赖关系是一个很好的机制,Spring 容器还可以自动装配合作关系bean 之间的关联关系.这意味着Spring 可以通过向Bean Factory ...

  6. Spring精华问答 | Spring Bean的自动装配是怎么回事?

    戳蓝字"CSDN云计算"关注我们哦! Spring框架是由于软件开发的复杂性而创建的.Spring使用的是基本的JavaBean来完成以前只可能由EJB完成的事情.然而,Sprin ...

  7. Spring基础——在 Spring Config 文件中基于 XML 的 Bean 的自动装配

    一.Spring IOC 容器支持自动装配 Bean,所谓自动装配是指,不需要通过 <property> 或 <constructor-arg> 为 Bean 的属性注入值的过 ...

  8. [Spring]Bean的自动装配

    Spring支持5种自动装配模式,如下: 1.no --默认情况下,不自动装配,通过"ref"attribute手动设定. 2.buName --根据Property的Name自动 ...

  9. [Spring实战系列](12)Bean的自动装配

    Spring提供了4种各具特色的自动装配策略: 类型 说明 no 默认方式,Bean的引用必须通过XML文件中的</ref>元素或者ref属性手动设定. byName 把与Bean的属性具 ...

  10. 万字详解! Spring Bean的自动装配

    点击上方 Java学习之道,选择 设为星标 每天18点,干货准时奉上! 何为自动装配 自动装配是 Spring 满足 bean 依赖的一种方式. 在使用 Spring 配置 bean 时,我们都要给配 ...

最新文章

  1. 有道云笔记Windows桌面版v6.5.0.0去左下角广告方法
  2. (转载)输出文件的指定行
  3. echarty轴自定义显示不全_表格打印不全怎么办?这招超简单!
  4. 在html中怎么写背景色渐变,css3背景色渐变
  5. 数组java8求和_java – 如何使用IntStream对int数组的特定索引号求和?
  6. 【斗地主 javascript js 斗地主 AI 人机 网页在线】基于专家系统的斗地主AI算法
  7. Proteus8仿真STM32F103R6的电压轨道问题
  8. 程序员面试金典--疯狂刷
  9. Windows桌面图标消失或桌面路径变更
  10. 输入一个十进制整数,分别输出其二进制、八进制、十六进制字符串
  11. Mybatis generator mapper文件重新生成不会覆盖原文件
  12. 艺点动画-跟随原理讲解
  13. CBS,PCBS,ECBS,EPCBS
  14. 电脑上传网速怎么测试软件,Win7如何测试电脑上传速度?
  15. 每周好书推荐《那些古怪又令人忧心的问题》
  16. python绘制梅花_Python | 巧用生成表达式、让循环显得高大上 !
  17. 专题·莫比乌斯函数与欧拉函数【including 整除分块,积性函数,狄利克雷卷积,欧拉函数,莫比乌斯函数,莫比乌斯反演
  18. MCGS-函数读取数据
  19. PyQt5组件之QPixmap
  20. 无穷的分数,有时会趋向于固定的数字。 请计算【图1.jpg】所示的无穷分数,要求四舍五入,精确到小数点后5位,小数位不足的补0。 图1.jpg 请填写该浮点数,不能填写任何多余的内容。

热门文章

  1. 实变函数--from 水木清华 (www.smth.org)
  2. java数据透视表_java poi生成数据透视表
  3. android自定义搜索栏,Android自定义View实现搜索框(SearchView)功能
  4. oracle数据库主机账号,Oracle_数据库主机oracle账号被删除
  5. 气象数据随时随地:让天气预报API为您的应用提供精准的天气信息
  6. ZSS-25自动扫描射水高空水炮市场厂家分析参数数据
  7. 南京邮电大学计算机学院研究生录取通知书,南京邮电大学2017年硕士研究生录取通知书发放通知...
  8. 局域网计算机可以ping通不能访问共享,局域网可以ping通为什么打不开共享文件夹...
  9. 通用蓝牙打印安卓_宣布通用打印:基于云的打印解决方案
  10. PHP导出数据为excel文件