目录

  • 1. 环境搭建
  • 2. byName、byType
  • 3. 使用注解实现自动装配
    • @Autowired
    • @Resource
    • 小结

  • 自动装配是Spring满足bean依赖的一种方式
  • Spring会在上下文中自动寻找,并且自动给bean装配属性

1. 环境搭建

一个人有猫和狗两个宠物

结构图

Cat.java

package pojo;public class Cat {public void shout() {System.out.println("喵~");}
}

Dog.java

package pojo;public class Dog {public void shout() {System.out.println("汪~");}
}

People.java

package pojo;public class People {private Cat cat;private Dog dog;private String name;public void setCat(Cat cat) {this.cat = cat;}public void setDog(Dog dog) {this.dog = dog;}public void setName(String name) {this.name = name;}public Cat getCat() {return cat;}public Dog getDog() {return dog;}public String getName() {return name;}
}

beans.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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="cat" class="pojo.Cat"/><bean id="dog" class="pojo.Dog"/><bean id="people" class="pojo.People"><property name="name" value="zsr"/><property name="dog" ref="dog"/><property name="cat" ref="cat"/></bean>
</beans>

MyTest.java

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import pojo.People;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();System.out.println(people.getName());}
}

测试:

到此环境搭建成功!


2. byName、byType

上述代码中,ref就是寻找对应的cat和dog对象;如果有一种机制,能够自动在bean里面寻找我们要设置的cat或者dog,自动装配,就不用写下面的那两行代码了!这就引入了自动装配

我们更改一下.xml文件,删除那两行代码,加入autowire属性,发现有几种可以选择,这里先选择byName

<bean id="cat" class="pojo.Cat"/>
<bean id="dog" class="pojo.Dog"/>
<bean id="people" class="pojo.People" autowire="byName"><property name="name" value="zsr"/>
</bean>

再次运行测试类,依旧成功,说明我们的cat和dog被自动设置到了people中

那我们再更改一下,将dog改为dog1

<bean id="cat" class="pojo.Cat"/>
<bean id="dog1" class="pojo.Dog"/>
<bean id="people" class="pojo.People" autowire="byName"><property name="name" value="zsr"/>
</bean>

再进行测试,发现空指针异常

为什么??

byName:根据属性名自动装配,检查IoC容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。

因此bean的id只有为dog或者cat才能够被找到


我们再改一下,将byName改为byType

<bean id="cat" class="pojo.Cat"/>
<bean id="dog" class="pojo.Dog"/>
<bean id="people" class="pojo.People" autowire="byType"><property name="name" value="zsr"/>
</bean>

再次运行,又成功了

byType:根据属性类型自动装配

  • 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配
  • 如果存在多个该类型bean,那么抛出异常,并指出不能使用byType方式进行自动装配;
  • 如果没有找到相匹配的bean,则什么事都不发生

必须保证类型全局唯一,如果多加一个dog,则报错:

可以省略id

<bean class="pojo.Cat"/>
<bean class="pojo.Dog"/>
<bean id="people" class="pojo.People" autowire="byType"><property name="name" value="zsr"/>
</bean>

小结

  • byName的时候,需要保证所有bean的id唯一,并且这个bean id需要和实体类中对应的属性名相同
  • byName的时候,需要保证所有bean的class唯一,并且这个bean id需要和自动注入属性的类型一致;可以省略id

3. 使用注解实现自动装配

jdk1.5支持注解,Spring2.5支持注解

要使用注解

  1. xml中导入约束

    <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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd">
    
  2. xml中配置注解支持

    <context:annotation-config/>
    

@Autowired

  • 直接在属性上使用即可,此时就可以省略set方法
  • 也可以在set方法上使用(适用于在set方法里面写一些处理逻辑的情况)

    beans.xml
<context:annotation-config/><bean id="cat1" class="pojo.Cat"/>
<bean id="dog1" class="pojo.Dog"/>
<bean id="people" class="pojo.People"><property name="name" value="zsr"/>
</bean>

运行测试类,成功

自动装配环境很复杂的情况下:假设此时有两个cat和dog对象

<context:annotation-config/><bean id="cat1" class="pojo.Cat"/>
<bean id="cat2" class="pojo.Cat"/>
<bean id="dog1" class="pojo.Dog"/>
<bean id="dog2" class="pojo.Dog"/>
<bean id="people" class="pojo.People"><property name="name" value="zsr"/>
</bean>

发现直接爆红了

这是因为无法匹配到对应的属性,@Autowired 默认通过 byType 的方式实现,如果有多个对象,则通过 byName 查找,如果都找不到,则报错;

此时通过有两个相同类型的对象,通过类型无法找到,bean id也不与属性名相同,通过名字也找不到,所以报错;

这时候就需要配合@Qualifier来使用,指定唯一的bean对象来注入

再次运行,即可成功


@Qualifier还可以设置required属性值为false 允许属性值为null


@Resource

我们将上述的Autowired换成Resource

xml文件为

<context:annotation-config/><bean id="cat1" class="pojo.Cat"/>
<bean id="cat2" class="pojo.Cat"/>
<bean id="dog1" class="pojo.Dog"/>
<bean id="dog2" class="pojo.Dog"/>
<bean id="people" class="pojo.People"><property name="name" value="zsr"/>
</bean>

直接运行

发现报错了,这是因为我们无法匹配到对应的属性,@Resource 默认通过 byName 的方式实现,如果找不到名字, 则通过 byType 实现!如果两个都找不到,就会报错

此时,名字cat1/cat2/dog1/dog2不匹配,且每个类型的bean不唯一,所以通过名字和类型都找不到,因此报错

如果我们将其中一个bean的id改为对应的属性名catdog

<bean id="cat" class="pojo.Cat"/>
<bean id="cat2" class="pojo.Cat"/>
<bean id="dog" class="pojo.Dog"/>
<bean id="dog2" class="pojo.Dog"/>
<bean id="people" class="pojo.People"><property name="name" value="zsr"/>
</bean>

再次运行,成功了

这是因为我们通过名字找到了
我们还有另一种解决方式,不用更改bean的id,我们在@Resource里面添加name属性

通过设置name属性指定装配的对象

此时再运行,成功注入


小结

@Autowired和@Resource的相同点

  • 都是用于自动装配的,都可以放在属性字段set方法

@Autowired和@Resource的区别

  • @Autowired为Spring提供的注解,@Resource为java提供的注解
  • @Autowired 默认通过 byType 的方式实现,如果有多个对象,则通过 byName 查找,如果都找不到,则报错;此时可以用@Qualifier指定唯一的bean对象
  • @Resource 默认通过 byName 的方式实现,如果找不到名字, 则通过 byType 实现!如果两个都找不到,就会报错

详解Spring中Bean的自动装配~相关推荐

  1. 五篇教你掌握spring之三:详解Spring的bean以及注解开发

    详解Spring的bean以及注解开发 各种复杂类型的依赖注入 我们采用一个类的大杂烩的形式,新建一个Student package com.lwh.pojo;import java.util.*;p ...

  2. 用IDEA详解Spring中的IoC和DI(挺透彻的,点进来看看吧)

    用IDEA详解Spring中的IoC和DI 一.Spring IoC的基本概念 控制反转(IoC)是一个比较抽象的概念,它主要用来消减计算机程序的耦合问题,是Spring框架的核心. 依赖注入(DI) ...

  3. Spring框架学习教程,详解Spring注入bean的几种方式

    首先,要学习Spring中的Bean的注入方式,就要先了解什么是依赖注入. 依赖注入是指:让调用类对某一接口的实现类的实现类的依赖关系由第三方注入,以此来消除调用类对某一接口实现类的依赖. Sprin ...

  4. 218.94.78.76:20001/index.php,详解spring中使用Elasticsearch的实例教程

    本篇文章主要介绍了详解spring中使用Elasticsearch的代码实现,具有一定的参考价值,有兴趣的可以了解一下 在使用Elasticsearch之前,先给大家聊一点干货. 1. ES和solr ...

  5. Spring之Bean的自动装配

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

  6. Spring之 Bean的自动装配

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

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

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

  8. 详解Spring中@Autowire,@Value 注解实现原理

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/u013202238/article/details/107879726 本文主要基于SpringBoot-2.3.3.RELE ...

  9. java中config是什么意思,详解Spring中的JavaConfig注解

    前言 大家都知道传统spring一般都是基于xml配置的,不过后来新增了许多JavaConfig的注解.特别是springboot,基本都是清一色的java config,不了解一下,还真是不适应.这 ...

最新文章

  1. linux 打开文件错误 too many open files 解决 ulimit 简介
  2. 【Linux 内核 内存管理】Linux 内核堆内存管理 ③ ( CPU 计数器瓶颈 | per-CPU 计数器 | Linux 内核 percpu_counter 结构体源码 )
  3. 数据结构与算法(1)——数组与链表
  4. linux 串口驱动(二)初始化 【转】
  5. Asp.Net Core获取请求信息/获取请求地址
  6. 使用Jedis连接远程服务器的redis
  7. 大数据技术之 Kafka (第 4 章 Kafka API ) Producer API
  8. 【教程】条形码组件Spire.Barcode 教程:如何在C#中创建DataMatrix条码
  9. 综述 | 自动驾驶中的计算机视觉
  10. 高质量壁纸网站,满足壁纸控的所有想象!
  11. 华为应用锁退出立即锁_华为P40系列三大安全锁,教你锁住你的隐私 - 企业资讯...
  12. python初心记录一
  13. python @符号_用Python学数学之Sympy代数符号运算
  14. 鸟哥-服务器 学习笔记
  15. 自动化运维落实到位的三点基础及常用工具对比
  16. php实现mpg自动提取音轨,视频如何导出音轨 怎么将双音轨mpg提取其中一个音轨保存...
  17. openwrt开发--应用程序IPK包开发
  18. aistudio 常规赛:钢铁缺陷检测挑战赛 经验总结,轻松复现map 47排名再度提升
  19. 比较好用的学习、工具网站推荐
  20. ie8安装java提示被阻止_IE8浏览器安装失败的解决方法

热门文章

  1. CentOS 6.5 下配置Java环境
  2. debian10 简单的CA使用
  3. 【转载】写博意味着什么?
  4. 【Sql Server】DateBase-结构化查询基础
  5. Android 的NDK的Makefile编写
  6. TensorFlow基础笔记(11) max_pool2D函数 深度学习
  7. distill bert 相关问题
  8. 使用 Pytorch 实现 skip-gram 的 word2vec
  9. 三段式LLVM编译器
  10. MindSpore张量mindspore::tensor