文章目录

  • 自动装配bean
    • 1. 环境搭建
    • 2. byName自动装配
    • 3. byType自动装配
    • 4. 使用注解自动装配
      • 4.1 @Autowired和@Qualifier
      • 4.2 @Resource
      • 4.3 总结

自动装配bean

自动装配说明

  • 自动装配是使用spring满足bean依赖的一种方法

  • spring会在应用上下文中为某个bean寻找其依赖的bean。

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

  • 组件扫描(component scanning):spring会自动发现应用上下文中所创建的bean;

  • 自动装配(autowiring):spring自动满足bean之间的依赖,也就是我们说的IoC/DI;

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

1. 环境搭建

public class Cat {public void shout(){System.out.println("喵(>^ω^<)~");}
}
public class Dog {public void shout(){System.out.println("汪!");}
}
public class People {private Cat cat;private Dog dog;private String 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;}@Overridepublic String toString() {return "People{" +"cat=" + cat +", dog=" + dog +", name='" + name + '\'' +'}';}
}

测试
bean

    <bean id="dog" class="com.zh.pojo.Dog"/><bean id="cat" class="com.zh.pojo.Cat"/><bean id="people" class="com.zh.pojo.People"><property name="name" value="伊泽瑞尔"/><property name="cat"  ref="cat"/><property name="dog" ref="dog"/></bean>
public class MyTest {@Testpublic void test1(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");People people = context.getBean("people", People.class);people.getCat().shout();people.getDog().shout();}
}

2. byName自动装配

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

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

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

    <bean id="people" class="com.zh.pojo.People" autowire="byName"><property name="name" value="伊泽瑞尔"/></bean>

测试依然成功
将 cat 的bean id修改为 catXXX 则出现空指针异常

注意!
使用byName实现自动装配,对象名必须与beanid相同。

3. byType自动装配

<bean id="dog" class="com.zh.pojo.Dog"/><bean id="cat" class="com.zh.pojo.Cat"/><bean id="people" class="com.zh.pojo.People" autowire="byType"><property name="name" value="伊泽瑞尔"/></bean>

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

4. 使用注解自动装配

准备工作
在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"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!--开启注解支持--><context:annotation-config/><bean id="dog" class="com.zh.pojo.Dog"/><bean id="cat" class="com.zh.pojo.Cat"/><bean id="cat2" class="com.zh.pojo.Cat"/><bean id="people" class="com.zh.pojo.People" autowire="byType"/></beans>

4.1 @Autowired和@Qualifier

@Autowired

  • @Autowired是按类型自动转配的,不支持id匹配。

  • 需要导入 spring-aop的包!

@Qualifier

  • @Autowired是根据类型自动装配的,加上@Qualifier则可以根据byName的方式自动装配

  • @Qualifier不能单独使用。

这两个注解可以配合使用,但一般开发情况下只需要@Autowired注解即可

测试:

public class People {@Autowired@Qualifier(value = "cat2")private Cat cat;@Autowiredprivate Dog dog;private String name;public Cat getCat() {return cat;}public Dog getDog() {return dog;}public String getName() {return name;}@Overridepublic String toString() {return "People{" +"cat=" + cat +", dog=" + dog +", name='" + name + '\'' +'}';}
}

使用@Autowired注解时,由于是运用反射机制,所以可以不用写set方法。
输出

4.2 @Resource

  • @Resource如有指定的name属性,先按该属性进行byName方式查找装配;

  • 其次再进行默认的byName方式进行装配;

  • 如果以上都不成功,则按byType的方式自动装配。

  • 都不成功,则报异常。

实体类

public class User {//如果允许对象为null,设置required = false,默认为true@Resource(name = "cat2")private Cat cat;@Resourceprivate Dog dog;private String str;
}

beans.xml

<bean id="dog" class="com.kuang.pojo.Dog"/>
<bean id="cat1" class="com.kuang.pojo.Cat"/>
<bean id="cat2" class="com.kuang.pojo.Cat"/>

4.3 总结

@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)自动装配bean相关推荐

  1. Spring自动装配Bean

    除了使用 XML 和 Annotation 的方式装配 Bean 以外,还有一种常用的装配方式--自动装配.自动装配就是指 Spring 容器可以自动装配(autowire)相互协作的 Bean 之间 ...

  2. spring自动装配Bean的五种方式

    no:默认方式,手动装配方式,需要通过ref设定bean的依赖关系 byName:根据bean的名字进行装配,当一个bean的名称和其他bean的属性一致,则自动装配 byType:根据bean的类型 ...

  3. spring二:装配bean(自动装配)

    创建应用对象之间协作关系的行为通常称为装配(wiring),这就是依赖注入(DI)的本质. Spring提供了三种主要的装配机制: 1. 在xml中进行显式配置.  2. 在java中进行显式配置. ...

  4. Spring学习笔记--自动装配Bean属性

    Spring提供了四种类型的自动装配策略: byName – 把与Bean的属性具有相同名字(或者ID)的其他Bean自动装配到Bean的对应属性中. byType – 把与Bean的属性具有相同类型 ...

  5. Spring自动装配Beans

    在Spring框架,可以用 auto-wiring 功能会自动装配Bean.要启用它,只需要在 <bean>定义"autowire"属性. <bean id=&q ...

  6. Spring实战(三)Spring中装配Bean的三种方式---XML、JavaConfig、AutoWire

    创建应用对象之间协作关系的行为称为装配(wiring),这也是依赖注入的本质. Spring容器负责创建应用程序中的bean并通过DI来协调这些对象之间的关系,而开发者需要告诉Spring需要创建哪些 ...

  7. Spring之装配Bean(一)

    Spring中装配bean的三种主要方式 1.隐式的bean发现机制和自动化装配 组件扫描( component scanning) : Spring会自动发现应用上下文中所创建的bean. 自动装配 ...

  8. Spring 自动装配 ‘byType’

    转载自   Spring 自动装配 'byType' Spring 自动装配 'byType' 这种模式由属性类型指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans ...

  9. Spring 自动装配 ‘byName’

    转载自  Spring 自动装配 'byName' Spring 自动装配 'byName' 这种模式由属性名称指定自动装配.Spring 容器看作 beans,在 XML 配置文件中 beans 的 ...

最新文章

  1. Mysql-学习笔记(==》常用函数 八)
  2. Android输入输出机制之来龙去脉之前生后世
  3. 学python需要什么基础知识-没学过Python先要学习哪些基础知识?
  4. win10 安装 Pytorch
  5. Debug system:无法显示数据
  6. 分享30个最佳 jQuery Lightbox 效果插件
  7. HDU 3473 Minimum Sum
  8. POJ 3250 Bad Hair Day【单调队列】
  9. 转贴:电子商务如何提升网站转化率之:谷歌9条
  10. 使用命令行修改当前gnome终端的名称技术
  11. python添加音乐_python给视频添加背景音乐并改变音量的具体方法
  12. php编辑日历,【PHP】制作日历
  13. 方波峰峰值和有效值_峰峰值,峰值,平均值,有效值的关系.pdf
  14. Python Algorithms Learning Notes(1)--Asymptotic Notations
  15. bootstrap-入门学习-流体容器与响应式布局容器
  16. 随机抽样C语言,R语言中实现简单随机抽样
  17. 抖音短视频吃鸡戏精野生脆脆如何上的热门
  18. Web前端如何快速的兼容手机
  19. php获取农历日期节日
  20. 链接:https://pan.baidu.com/s/1joRvLQ7nbti0Wp4t2CkX5w 提取码:ZMTD

热门文章

  1. C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数发生器种子( seed)
  2. 深度探索C++ 对象模型(4)-Default Copy Constructor(3)
  3. controller-runtime 控制器实现
  4. 删除有序数组中的重复项(数组去重)
  5. shell编程之数学运算
  6. irq domain介绍和代码导读
  7. 06-CA/TA编程:rsa demo
  8. android指纹fingerprint学习总结
  9. 【网络安全】SQL注入攻击思路手法总结(上)
  10. 一次ctf中代码审计分析