Spring之依赖注入方式

对象和对象之间存在相互依赖关系,因此就需要在创建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>

通过set方法注入

其实本质上还是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命名空间

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"/>

自动装配

  • byName:根据名字(id)自动装配
  • byType:根据类型自动装配

xml实现自动装配

在配置applicationContext.xml文件的时候就可以配置自动装配属性autowire

byName

<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}]}

byType

<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"

注解实现自动装配

byName

@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;
}

byType

@Component("myCar")
public class Car {
    @Autowired
    private Wheel wheel;
}

@Component
public class Wheel {
    @Value("12.5")
    private Double radius;
}

你可能感兴趣的:(Java-Spring)