依赖注入 —— Spring(四)

依赖注入的概念

  依赖注入:Dependency Injection。它是Spring框架核心Ioc的具体实现。

  我们的程序在编写时,通过控制反转,把对象的创建交给了Spring,但是代码当中不可能没有出现依赖的情况。Ioc解耦只是降低它们的依赖关系,但不会清除。

  例如,业务层仍然会调用持久层的方法,这种依赖关系,在使用Spring之后,就需要让Spring来进行维护。

  简单地说,就是等框架把持久层的对象传入到业务层,而不用自己去获取。

 

构造函数的注入

  使用类中的构造函数,给变量赋值,需要注意,赋值的操作不是我们自己做的,而是通过配置的方式,让Spring框架来为我们注入。

public class AccountServiceImpl implements IAccountService {
    private String name;
    private Integer age;
    private Date birthday;

    public AccountServiceImpl(String name, Integer age, Date birthday) {
        this.name = name;
        this.age = age;
        this.birthday = birthday; 
    }

    @Override
    public void saveAccount() {
        System.out.println(name+","+age+","+birthday);
    } 
}

  使用constructor-arg标签,采用使用构造函数的方式,给service中的属性传值。类中需要提供一个对应参数列表的构造函数。

  constructor-arg

    index:指定参数在构造函数参数列表中的索引位置

    type:指定参数在构造函数中的数据类型。

    name:指定参数在构造函数中的名称。

    value:它能赋值基本数据类型和String类型

    reg:它能赋值其他Bean类型,必须是在配置文件中配置过的Bean。

<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"> 
    <constructor-arg name="name" value="张三"></constructor-arg> 
    <constructor-arg name="age" value="18"></constructor-arg> 
    <constructor-arg name="birthday" ref="now"></constructor-arg>
</bean> 

<bean id="now" class="java.util.Date"></bean>

 

set方法注入

  在类中提供需要注入成员的set方法。

public class AccountServiceImpl implements IAccountService {
    private String name;
    private Integer age;
    private Date birthday;

    public void setName(String name) {
        this.name = name; 
    }

    public void setAge(Integer age) {
        this.age = age; 
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday; 
    }

    @Override
    public void saveAccount() {
        System.out.println(name+","+age+","+birthday);
    } 
}    

  使用property标签,通过配置文件给bean中的属性传值。

  property

    name:找到类中set方法后面的部分

    ref:给属性赋值是其他bean类型

    value:给属性复制是基本数据类型和String类型。

<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl"> 
    <property name="name" value="test"></property> 
    <property name="age" value="21"></property> 
    <property name="birthday" ref="now"></property>

</bean> <bean id="now" class="java.util.Date"></bean>

 

使用p名称空间注入数据

  通过在xml空间中导入p名称空间,使用p:propertyName来注入数据,它的本质还是调用类中的set方法实现注入功能。

public class AccountServiceImpl implements IAccountService {
    private String name;
    private Integer age;
    private Date birthday;

    public void setName(String name) {
        this.name = name; 
    }

    public void setAge(Integer age) {
        this.age = age; 
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday; 
    }

    @Override
    public void saveAccount() {
        System.out.println(name+","+age+","+birthday);
    } 
}    
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=" http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd">
 
<bean id="accountService" 
 class="com.itcast.service.impl.AccountServiceImpl4"
 p:name="test" p:age="21" p:birthday-ref="now"/>
</beans>

 

注入集合属性

  给类中的集合成员传值,使用的也是set方法注入,不过变量的数据类型都是集合。

public class AccountServiceImpl implements IAccountService {
    private String[] myStrs;
    private List<String> myList;
    private Set<String> mySet;
    private Map<String,String> myMap;
    private Properties myProps;

    public void setMyStrs(String[] myStrs) {
        this.myStrs = myStrs; 
    }

    public void setMyList(List<String> myList) {
        this.myList = myList; 
    }

    public void setMySet(Set<String> mySet) {
        this.mySet = mySet; 
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap; 
    }

    public void setMyProps(Properties myProps) {
        this.myProps = myProps; 
    }

    @Override
    public void saveAccount() {
        System.out.println(Arrays.toString(myStrs));
        System.out.println(myList);
        System.out.println(mySet);
        System.out.println(myMap);
        System.out.println(myProps);
    } 
}
<bean id="accountService" class="com.itcast.service.impl.AccountServiceImpl">

<!-- 在注入集合数据时,只要结构相同,标签可以互换 -->

<!-- 给数组注入数据 --> 
<property name="myStrs"> 
    <set>
        <value>AAA</value> 
        <value>BBB</value> 
        <value>CCC</value>
    </set>
</property>

<!-- 注入 list 集合数据 --> 
<property name="myList"> 
    <array> 
        <value>AAA</value> 
        <value>BBB</value> 
        <value>CCC</value>
    </array>
</property>

<!-- 注入 set 集合数据 --> 
<property name="mySet"> 
    <list>
        <value>AAA</value> 
        <value>BBB</value> 
        <value>CCC</value>
    </list>
</property>

<!-- 注入 Map 数据 --> 
<property name="myMap"> 
    <props> 
        <prop key="testA">aaa</prop> 
        <prop key="testB">bbb</prop>
    </props>
</property>

<!-- 注入 properties 数据 -->
<property name="myProps"> 
    <map>
        <entry key="testA" value="aaa"></entry> 
        <entry key="testB"> 
            <value>bbb</value>
        </entry>
    </map>
</property>

</bean>

 

上一篇:mysql 学习 - 索引深度理解


下一篇:实体类属性名和数据库表字段名不对应的几种情况以及解决方式