再说自动装配之前,我们先聊一聊什么是手动装配。

手动装配就是我们在先前讲的那些,要自己给定属性,然后赋值

Spring IOC容器可以自动装配Bean,需要做的仅仅实在<bean>的autowire属性里指定自动装配的模式

byType(根据类型自动装配):若IOC容器中有多个与目标Bean类型一致的Bean。在这种情况下,Spring将无法判断哪个Bean最合适该属性,所以不能执行自动配置。

byName(根据名称自动装配):必须将目标Bean的名称和属性名设置的完全相同。

constructor(通过构造器自动装配):当Bean中存在多个构造器时,此种自动装配方式会很复杂,不推荐使用

重新写一个新的包,创建几个新的JavaBean,

Address:

private String city;
private String street;

Car:

private String brand;
private double price;

Person:

private String name;
private Address address;
private Car car;

创建新的配置文件:beans-autowire.xml

byname

我们先按照先前的步骤溜一遍:

  1. <bean id="address" class="com.figsprite.bean.autowire.Address"  
  2.       p:city="上海" p:street="陆家嘴"></bean>  
  3.     
  4. <bean id="car" class="com.figsprite.bean.autowire.Car"  
  5.       p:brand="奥迪" p:price="233"></bean>  
  6.     
  7. <bean id="person" class="com.figsprite.bean.autowire.Person"  
  8.       p:name="小雨" p:car-ref="car" p:address-ref="address"></bean>  

然后更改最后Person类的配置,让其中的Car和Address改成自动装配。

先使用byName,我们此时Car和Address两个对象<bean>的id刚好和我们在Person.java里的setter风格的属性名保持一致,因此是没有问题的,

<bean id="person" class="com.figsprite.bean.autowire.Person"
p:name="
小雨" autowire="byName"></bean>

注意这里是setter风格的属性名一致,而不是与类名一致,我们可以试着改掉Person.java里的属性名

private String name;

private Address address;

private Car mycar;

同时也将setter方法改掉:

发现car为空,如果仅仅只改属性名(字段名),不改setter风格的属性名,是没什么异样的。

所以byName是根据bean的名字和当前bean的setter风格的属性名进行自动装配,若有匹配成功的,则进行自动装配,若匹配不成功,则不装配

byType

这个是根据类型配的,我们先把之前改过的Person.java还原成最初的模样:

我们改一下Car的容器id

<bean id="helloCar" class="com.figsprite.bean.autowire.Car"
p:brand="
奥迪" p:price="233"></bean>

如果我们还是使用byName,结果可想而知

Person{name='小雨', address=Address{city='上海', street='陆家嘴'}, car=null}

接下来我们换成byType:

Person{name='小雨', address=Address{city='上海', street='陆家嘴'}, car=Car{brand='奥迪', price=233.0}}

意料之中,不过之前有说过byType的致命弱点,不可以出现两个相同类型的容器,这里,我们再加一个Car容器,优秀的IDEA已经自己报错了,我们还是强制运行一下:

自动装配的缺点

  1. 属性要么都是用自动装配的形式,要么不用,不能部分使用,部分不使用
  2. 要么byName,要么byType,不能兼用

    所以其实我们很少用这个功能,弊大于利。

Bean的自动装配的更多相关文章

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

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

  2. spring实战二之Bean的自动装配(非注解方式)

    Bean的自动装配 自动装配(autowiring)有助于减少甚至消除配置<property>元素和<constructor-arg>元素,让Spring自动识别如何装配Bea ...

  3. Spring bean的自动装配属性

    bean的自动装配属性能简化xml文件配置. bean 的自动装配属性分为四种: 1.byName 2.byTyoe 3.constructor 4. autodetect byName: 它查找配置 ...

  4. Spring(三):bean的自动装配

    Bean的自动装配 自动装配是Spring满足bean依赖的一种方式. Spring会在上下文中自动寻找,并自动给bean装配属性 Spring中三种装配方式 在xml中显式的配置. 在java中显式 ...

  5. Spring-04 Bean的自动装配

    Spring-04 Bean的自动装配 Bean的自动装配 1.自动装配说明 自动装配是使用spring满足bean依赖的一种方法. spring会在应用上下文中为某个bean寻找其依赖的bean. ...

  6. Spring学习03(Bean的自动装配)

    6.Bean的自动装配 6.1 自动装配说明 自动装配是使用spring满足bean依赖的一种方法 spring会在应用上下文中为某个bean寻找其依赖的bean. Spring中bean的三种装配机 ...

  7. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  8. spring实战四之Bean的自动装配(注解方式)

    使用注解装配: 从spring2.5开始,Spring启用了使用注解自动装配Bean的属性,使用注解方式自动装配与在XML中使用 autowire 属性自动装配并没有太大区别,但是使用注解方式允许更细 ...

  9. spring bean autowire自动装配

    转自:http://blog.csdn.net/xiao_jun_0820/article/details/7233139 autowire="byName"会自动装配属性与Bea ...

随机推荐

  1. PHP中的Define和Const区别

    我们经常把不经常变的值定义成常量,常量一般用全部大写来表示,前面不加美元符号,那么define和const有什么区别呢? 常量是一个简单的标识符.在脚本执行期间该值不能改变(除了所谓的魔术常量,他们其 ...

  2. win10 git bash 闪退

    使用ghost重装了win10 专业版后.安装git,尝试重装了n个版本的git,右键git bash here 直接闪退,直接进入安装目录打开git-bash.exe依旧闪退, git右键点击Git ...

  3. 设计模式总结(Java)—— 观察者模式

    概述 它用于建立一种对象与对象之间的依赖关系,一个对象发生改变时将自动通知其他对象,其他对象将相应作出反应.在观察者模式中,发生改变的对象称为观察目标,而被通知的对象称为观察者,一个观察目标可以对应多 ...

  4. 程序员奇谈之我写的程序不可能有bug篇

    程序员在普通人的印象里是一份严(ku)谨(bi)的职业,也是一个被搞怪吐槽乐此不疲的职业,程序员们面对复杂的代码敲打电脑时连眉头都不会皱一下,但是有一个词却是他们痛苦的根源,它就是Bug. 有不少的新 ...

  5. finereport报表--动态格间运算 一

    一.运算符:   ! 绝对值 A2[A2:!1] ;   A2 标示从列A纵向第2单元格开始,!1 表示第1个位置的单元格; [A2:!1] 代表索引,表示从A列纵向开始往下,第1个单元格的位置的索引 ...

  6. 网络最大流算法—EK算法

    前言 EK算法是求网络最大流的最基础的算法,也是比较好理解的一种算法,利用它可以解决绝大多数最大流问题. 但是受到时间复杂度的限制,这种算法常常有TLE的风险 思想 还记得我们在介绍最大流的时候提到的 ...

  7. 启用WCF压缩提升Dynamics 365 CE的网络性能

    摘要: 微软动态CRM专家罗勇 ,回复307或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 本文系根据微 ...

  8. 【Dojo 1.x】笔记目录

    学习笔记和教程是不同的,笔记是随心记,学到什么就写什么,我尽量按逻辑顺序写笔记. Dojo是什么? Dojo是这么一个JavaScript框架,区别于jQuery等小型类库,这个类库更合适于构建Web ...

  9. 关于JPasswordField的getText()方法过时问题解决

    这几天想做一个登陆界面,用Jframe做,连接数据库时发现JPasswordField的getText()过时了,没法使用.查了资料发现改成了: try{ String sql="SELEC ...

  10. Git:五、操作远程仓库

    0.一般流程 1)自己新写:GitHub创建有README的库 -> clone到本地 2)修改已有:GitHub上fork别人的仓库 -> clone自己账号下的库到本地 1.创建库 右 ...