Bean的自动装配

    再说自动装配以前,咱们先聊一聊什么是手动装配。java

    手动装配就是咱们在先前讲的那些,要本身给定属性,而后赋值spa

    Spring IOC容器能够自动装配Bean,须要作的仅仅实在<bean>的autowire属性里指定自动装配的模式 code

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

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

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

    

    从新写一个新的包,建立几个新的JavaBean,ci

Address:it

private String city;
private String street;
class

 

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,不能兼用

    因此其实咱们不多用这个功能,弊大于利。

相关文章
相关标签/搜索