Bean的自动装配
本文内容纲要:
- byname- byType
- 自动装配的缺点
再说自动装配之前,我们先聊一聊什么是手动装配。
手动装配就是我们在先前讲的那些,要自己给定属性,然后赋值
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
我们先按照先前的步骤溜一遍:
- <beanid="address"class="com.figsprite.bean.autowire.Address"
- p:city="上海"p:street="陆家嘴">
- <beanid="car"class="com.figsprite.bean.autowire.Car"
- p:brand="奥迪"p:price="233">
- <beanid="person"class="com.figsprite.bean.autowire.Person"
- p:name="小雨"p:car-ref="car"p:address-ref="address">
然后更改最后Person类的配置,让其中的Car和Address改成自动装配。
先使用byName,我们此时Car和Address两个对象
<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已经自己报错了,我们还是强制运行一下:
自动装配的缺点
属性要么都是用自动装配的形式,要么不用,不能部分使用,部分不使用
要么byName,要么byType,不能兼用
所以其实我们很少用这个功能,弊大于利。
本文内容总结:byname,byType,自动装配的缺点,
原文链接:https://www.cnblogs.com/figsprite/p/10758983.html
以上是 Bean的自动装配 的全部内容, 来源链接: utcz.com/z/296139.html