对象和对象之间存在相互依赖关系,因此就需要在创建bean对象的时候执行依赖注入。
假设有以下两个类:Car和wheel,每辆车都有4个轮子,因此存在对象之间的依赖关系
public class Wheel {
private Double radius; // 半径
}
public class Car {
private List<Wheel> wheels;
}
我们在使用xml文件配置的时候,可以使用constructor-arg标签来指定创建bean对象所使用的构造器,同时指定该构造器各参数,这就是通过构造函数方式注入
<util:list id="wheels">
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
util:list>
<bean id="myCar" class="pojo.Car">
<constructor-arg type="java.util.List" index="0" ref="wheels"/>
bean>
其实本质上还是xml配置文件里的操作,只不过是这次使用的是property标签,对应调用的就是该属性的set方法
<util:list id="wheels">
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
util:list>
<bean id="myCar" class="pojo.Car">
<property name="wheels" ref="wheels"/>
bean>
p命名空间是Spring3.x版本以上有的一个简化写法,其实就是set方式注入,使用p来代替了property标签
首先在xml头部添加如下定义:
xmlns:p="http://www.springframework.org/schema/p"
然后就可以使用p标签
<util:list id="wheels">
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
util:list>
<bean id="myCar" class="pojo.Car" p:wheels-ref="wheels"/>
在配置applicationContext.xml文件的时候就可以配置自动装配属性autowire
<util:list id="wheels">
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
util:list>
<bean id="myCar" class="pojo.Car" autowire="byName"/>
这里指定byName就会自动寻找Id和Car类中属性名称相同的对象装配进来
Car{wheels=[Wheel{radius=null}, Wheel{radius=null}, Wheel{radius=null}, Wheel{radius=null}]}
<util:list id="wheels" list-class="java.util.ArrayList">
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
<bean class="pojo.Wheel"/>
util:list>
<bean id="myCar" class="pojo.Car" autowire="byType"/>
另外还可以在beans头标签中加入配置来使用默认自动分配
default-autowire="byType"
@Autowired注解默认是按类型进行装配,如果需要使用byName方式,需要结合@Qulifaier注解一起使用
```java
@Component("myCar")
public class Car {
@Autowired
@Qualifier("myWheel")
private Wheel wheel;
}
@Component("myWheel")
public class Wheel {
@Value("12.5")
private Double radius;
}
@Component("myCar")
public class Car {
@Autowired
private Wheel wheel;
}
@Component
public class Wheel {
@Value("12.5")
private Double radius;
}