Spring中SET方式注入、构造注入、自动注入

5. SET方式注入

5.1 八种基本类型 + String类型注入使用+Date类型(含数组类型)

八种基本类型 + String类型注入使用+Date类型 使用value属性进行赋值

  1. 在组件中定义基本类型 + String类型 + Date类型的成员变量并提供公开的SET方法
public class ClazzServiceImpl implements ClazzService{
    private ClazzDAO clazzDAO;
    // SET注入语法,注入的是基本类型(含String和Date类型)
    private String name;
    private Integer age;
    private boolean sex;
    private double price;
    private float counts;
    private Date bir;

    public void setBir(Date bir) {
        this.bir = bir;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setCounts(float counts) {
        this.counts = counts;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

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

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

    public void setClazzDAO(ClazzDAO clazzDAO) {
        this.clazzDAO = clazzDAO;
    }

    @Override
    public void save(String name) {
        System.out.println("Service name = " + name);
        clazzDAO.save(name);
        System.out.println("Name = " + this.name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
        System.out.println("price = " + price);
        System.out.println("counts = " + counts);
        System.out.println("bir = " + bir);
    }
}

在这里插入图片描述

  1. 在配置文件中使用property标签的value属性完成基本类型 + String类型 + Date类型的赋值
<!--管理DAO组件-->
<bean class="setdi.ClazzDAOImpl" id="clazzDAO">

</bean>

<!--管理Service组件-->
<bean class="setdi.ClazzServiceImpl" id="clazzService">
    <property name="clazzDAO" ref="clazzDAO"/>
    <!--SET注入相关语法 总结:八种基本类型 + String类型注入使用+Date类型 使用value属性进行赋值 -->
    <property name="name" value="张三"/>
    <property name="age" value="23"/>
    <property name="sex" value="true"/>
    <property name="counts" value="23.23"/>
    <property name="price" value="256.34"/>
    <!--注意:在spring技术栈中日期格式默认为yyyy/MM/dd HH:mm:ss-->
    <property name="bir" value="2012/12/12 23:54:57"/>
</bean>

在这里插入图片描述

测试类

public class TestSpring {
    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
        ClazzService clazzService = (ClazzService) context.getBean("clazzService");
        clazzService.save("小陈");
    }
}

结果

在这里插入图片描述

注意:在spring技术栈中日期格式默认为yyyy/MM/dd HH:mm:ss

例如上面日期属性的赋值可以填2012/12/12,也可以填2012/12/12 23:54:57

注入八种基本类型+String+Date类型的数组使用property、array、value标签进行赋值

  1. 在组件中定义String数组类型的成员变量,并提供公开的SET方法
    // 注入数组
    private String[] qqs;

    // 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
    所有成员变量公开的set方法...

    @Override
    public void save(String name) {
        System.out.println("Service name = " + name);
        clazzDAO.save(name);
        System.out.println("Name = " + this.name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
        System.out.println("price = " + price);
        System.out.println("counts = " + counts);
        System.out.println("bir = " + bir);
        System.out.println("=========遍历数组==============");
        for (String qq : qqs) {
            System.out.println(qq);
        }
	}

在这里插入图片描述

  1. 在配置文件中使用property、array、value标签完成String数组的赋值
<!--注入数组类型 array-->
<property name="qqs">
    <array>
        <value>小陈</value>
        <value>小三</value>
        <value>小胡</value>
        <value>小杨</value>
    </array>
</property>

在这里插入图片描述

测试类

public class TestSpring {
    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
        ClazzService clazzService = (ClazzService) context.getBean("clazzService");
        clazzService.save("小陈");
    }
}

结果

在这里插入图片描述

5.2 注入对象类型|引用类型(含数组)

注入对象类型|引用类型 统一使用ref属性进行注入

在这里插入图片描述

注入对象类型的数组使用property、array、ref标签进行赋值

  1. 在组件中定义类型为对象类型的数组的成员变量并提供公开的SET方法
// 注入引用类型数组
private ClazzDAO[] clazzDAOS;


// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...

    @Override
    public void save(String name) {
    System.out.println("Service name = " + name);
    clazzDAO.save(name);
    System.out.println("Name = " + this.name);
    System.out.println("age = " + age);
    System.out.println("sex = " + sex);
    System.out.println("price = " + price);
    System.out.println("counts = " + counts);
    System.out.println("bir = " + bir);
    System.out.println("=========遍历数组==============");
    for (String qq : qqs) {
        System.out.println(qq);
    }
    for (ClazzDAO dao : clazzDAOS) {
        System.out.println(dao);
    }
}

在这里插入图片描述

在配置文件中使用property、array、ref标签进行赋值

<property name="clazzDAOS">
    <array>
        <ref bean="clazzDAO"/>
        <ref bean="clazzDAO"/>
        <ref bean="clazzDAO"/>
    </array>
</property>

在这里插入图片描述

测试类

public class TestSpring {
    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
        ClazzService clazzService = (ClazzService) context.getBean("clazzService");
        clazzService.save("小陈");
    }
}

结果

在这里插入图片描述

5.3 注入集合类型

5.3.1 注入List

List中是基本数据类型|String类型|日期类型

  1. 声明一个集合,集合中的泛型是String类型并提供公开的SET方法
private List<String> habbies;
public void setHabbies(List<String> habbies) {
    this.habbies = habbies;
}
  1. 在配置文件中使用property、list、value标签进行赋值
<!--注入list集合-->
<property name="habbies">
    <list>
        <value>看书</value>
        <value>睡觉</value>
        <value>喝水</value>
    </list>
</property>

List中是对象类型

  1. 声明一个集合,集合中的泛型是对象类型并提供公开的SET方法
private List<ClazzDAO> clazzDAOList;

public void setClazzDAOList(List<ClazzDAO> clazzDAOList) {
    this.clazzDAOList = clazzDAOList;
}
  1. 在配置文件中使用property、list、ref标签进行赋值
<property name="clazzDAOList">
    <list>
        <!--ref标签中的bean属性中写的是前面spring中定义过的bean标签的唯一标识,即id-->
        <ref bean="clazzDAO"/>
        <ref bean="clazzDAO"/>
        <ref bean="clazzDAO"/>
    </list>
</property>

需要用到的ClazzServiceImpl类

// 需要用到的ClazzServiceImpl类
public class ClazzServiceImpl implements ClazzService{
    private ClazzDAO clazzDAO;
    // SET注入语法
    private String name;
    private Integer age;
    private boolean sex;
    private double price;
    private float counts;
    private Date bir;

    // 注入数组
    private String[] qqs;
    private ClazzDAO[] clazzDAOS;

    // 注入list集合
    private List<String> habbies;
    private List<ClazzDAO> clazzDAOList;
    
    // 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
	所有成员变量公开的set方法...

    @Override
    public void save(String name) {
        System.out.println("Service name = " + name);
        clazzDAO.save(name);
        System.out.println("Name = " + this.name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
        System.out.println("price = " + price);
        System.out.println("counts = " + counts);
        System.out.println("bir = " + bir);
        System.out.println("=========遍历数组==============");
        for (String qq : qqs) {
            System.out.println(qq);
        }
        for (ClazzDAO dao : clazzDAOS) {
            System.out.println(dao);
        }
        System.out.println("=========遍历集合==============");
        habbies.forEach(habby -> System.out.println("habby = " + habby));
        clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
    }
}

测试类

public class TestSpring {
    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
        ClazzService clazzService = (ClazzService) context.getBean("clazzService");
        clazzService.save("小陈");
    }
}

结果

在这里插入图片描述

5.3.2 注入map

map中key和value都为基本类型(或String类型或日期类型)

  1. 在组件中声明类型为Map类型且其中key和value都为基本类型的成员变量并提供公开的SET方法
// 注入map
private Map<String, String> maps;

// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...

    @Override
    public void save(String name) {
    System.out.println("Service name = " + name);
    clazzDAO.save(name);
    System.out.println("Name = " + this.name);
    System.out.println("age = " + age);
    System.out.println("sex = " + sex);
    System.out.println("price = " + price);
    System.out.println("counts = " + counts);
    System.out.println("bir = " + bir);
    System.out.println("=========遍历数组==============");
    for (String qq : qqs) {
        System.out.println(qq);
    }
    for (ClazzDAO dao : clazzDAOS) {
        System.out.println(dao);
    }
    System.out.println("=========遍历集合==============");
    habbies.forEach(habby -> System.out.println("habby = " + habby));
    clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
    maps.forEach((key, value) -> {
        System.out.println("key : " + key + "  value : " + value);
    });
}

在配置文件中使用property、map、entry标签进行赋值

<!--注入map集合-->
<property name="maps">
    <map>
        <entry key="aa" value="xiaochen"/>
        <entry key="bb" value="小陈"/>
        <entry key="cc" value="xiaoming"/>
    </map>
</property>

注意

对于entry标签而言,如果key基本类型(或者String类型或者日期类型)使用entry标签的key属性对键赋值,如果key对象类型,使用entry标签的key-ref属性对键赋值;同样,如果value是基本类型(或者String类型或者日期类型)使用entry标签的value属性对键赋值,如果value对象类型,使用entry标签的value-ref属性对键赋值。(另外,键的类型和值的类型不一定都得是基本类型或者都是对象类型,根据需要自己创建,很灵活)。

测试

public class TestSpring {
    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
        ClazzService clazzService = (ClazzService) context.getBean("clazzService");
        clazzService.save("小陈");
    }
}

结果

在这里插入图片描述

map中key和value都为对象类型

  1. 在组件中声明类型为Map类型且其中key和value都为对象类型的成员变量并提供公开的SET方法
private Map<ClazzDAO, ClazzDAO> map;

// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...

    @Override
    public void save(String name) {
    System.out.println("Service name = " + name);
    clazzDAO.save(name);
    System.out.println("Name = " + this.name);
    System.out.println("age = " + age);
    System.out.println("sex = " + sex);
    System.out.println("price = " + price);
    System.out.println("counts = " + counts);
    System.out.println("bir = " + bir);
    System.out.println("=========遍历数组==============");
    for (String qq : qqs) {
        System.out.println(qq);
    }
    for (ClazzDAO dao : clazzDAOS) {
        System.out.println(dao);
    }
    System.out.println("=========遍历集合==============");
    habbies.forEach(habby -> System.out.println("habby = " + habby));
    clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
    maps.forEach((key, value) -> {
        System.out.println("key : " + key + "  value : " + value);
    });
    map.forEach((key, value) -> {
        System.out.println("key : " + key + "   value : " + value);
    });
}

  1. 在配置文件中使用property、map、entry标签进行赋值
<!--注入map集合-->
</property>
<property name="map">
    <map>
        <entry key-ref="clazzDAO" value-ref="clazzDAO"/>
    </map>
</property>

注意

entry标签key-ref属性value-ref属性里面写的都是bean标签的唯一标识,即id

测试和结果

在这里插入图片描述

5.3.3 注入set

set中是基本类型(或String类型或日期类型)

  1. 在组件中声明类型为set且其中是String类型的成员变量并提供公开的SET方法
// 注入set
private Set<String> sets;

// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...

    @Override
    public void save(String name) {
    System.out.println("Service name = " + name);
    clazzDAO.save(name);
    System.out.println("Name = " + this.name);
    System.out.println("age = " + age);
    System.out.println("sex = " + sex);
    System.out.println("price = " + price);
    System.out.println("counts = " + counts);
    System.out.println("bir = " + bir);
    System.out.println("=========遍历数组==============");
    for (String qq : qqs) {
        System.out.println(qq);
    }
    for (ClazzDAO dao : clazzDAOS) {
        System.out.println(dao);
    }
    System.out.println("=========遍历集合==============");
    habbies.forEach(habby -> System.out.println("habby = " + habby));
    clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
    maps.forEach((key, value) -> {
        System.out.println("key : " + key + "  value : " + value);
    });
    map.forEach((key, value) -> {
        System.out.println("key : " + key + "   value : " + value);
    });
    System.out.println("=========遍历properties集合==============");
    properties.forEach((key, value) -> {
        System.out.println("key = " + key + "  value = " + value);
    });
    System.out.println("=========遍历set集合==============");
    sets.forEach(s -> System.out.println("s = " + s));
}

  1. 在配置文件中使用properties、set、value标签完成赋值
<!--注入set set中是String类型-->
<property name="sets">
    <set>
        <value>aaaa</value>
        <value>bbbb</value>
    </set>
</property>

测试和结果

在这里插入图片描述

set中是对象类型

  1. 在组件中声明类型为set且其中是对象类型的成员变量并提供公开的SET方法
private Set<ClazzDAO> daoSet;

// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...

    @Override
    public void save(String name) {
    System.out.println("Service name = " + name);
    clazzDAO.save(name);
    System.out.println("Name = " + this.name);
    System.out.println("age = " + age);
    System.out.println("sex = " + sex);
    System.out.println("price = " + price);
    System.out.println("counts = " + counts);
    System.out.println("bir = " + bir);
    System.out.println("=========遍历数组==============");
    for (String qq : qqs) {
        System.out.println(qq);
    }
    for (ClazzDAO dao : clazzDAOS) {
        System.out.println(dao);
    }
    System.out.println("=========遍历集合==============");
    habbies.forEach(habby -> System.out.println("habby = " + habby));
    clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
    maps.forEach((key, value) -> {
        System.out.println("key : " + key + "  value : " + value);
    });
    map.forEach((key, value) -> {
        System.out.println("key : " + key + "   value : " + value);
    });
    System.out.println("=========遍历properties集合==============");
    properties.forEach((key, value) -> {
        System.out.println("key = " + key + "  value = " + value);
    });
    System.out.println("=========遍历set集合==============");
    sets.forEach(s -> System.out.println("s = " + s));
    System.out.println("=========遍历set集合:里面是对象类型==============");
    daoSet.forEach(dao -> System.out.println("dao = " + dao));
}

  1. 在配置文件中使用properties、set、ref标签完成赋值
<!--注入set set中是对象类型-->
<property name="daoSet">
    <set>
        <!--注意:ref标签中的bean属性写前面的bean标签的唯一标识,即id-->
        <ref bean="clazzDAO"/>
    </set>
</property>

测试和结果

在这里插入图片描述

5.3.4 注入properties

properties本质是一个map,但是其注入方式与map有些不同,但遍历方式是一样的。

  1. 在组件中声明类型为properties的成员变量并提供公开的SET方法

// 注入Properties
private Properties properties;

// 为了避免代码过于冗长导致阅读不便,因此在博客中不显示成员变量的公开方法,但是在实际的代码中是有的
所有成员变量公开的set方法...

    @Override
    public void save(String name) {
    System.out.println("Service name = " + name);
    clazzDAO.save(name);
    System.out.println("Name = " + this.name);
    System.out.println("age = " + age);
    System.out.println("sex = " + sex);
    System.out.println("price = " + price);
    System.out.println("counts = " + counts);
    System.out.println("bir = " + bir);
    System.out.println("=========遍历数组==============");
    for (String qq : qqs) {
        System.out.println(qq);
    }
    for (ClazzDAO dao : clazzDAOS) {
        System.out.println(dao);
    }
    System.out.println("=========遍历集合==============");
    habbies.forEach(habby -> System.out.println("habby = " + habby));
    clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
    maps.forEach((key, value) -> {
        System.out.println("key : " + key + "  value : " + value);
    });
    map.forEach((key, value) -> {
        System.out.println("key : " + key + "   value : " + value);
    });
    System.out.println("=========遍历properties集合==============");
    properties.forEach((key, value) -> {
        System.out.println("key = " + key + "  value = " + value);
    });
}

  1. 在配置文件中使用properties、props、prop标签完成赋值
<!--注意:property标签是放在bean标签里面的-->
<!--注入properties-->
<property name="properties">
    <props>
        <prop key="111">aaa</prop>
        <prop key="222">bbb</prop>
        <prop key="333">ccc</prop>
    </props>
</property>

在这里插入图片描述

测试和结果

在这里插入图片描述

5.4 总结

包含基本类型(含String和Date类型)、对象类型、数组类型、List、Map、Set、Properties类型的代码(代码中标有详细的注释,可以很方便的找到自己想要找的类型)

用到的组件类以及里面的详细代码

public class ClazzServiceImpl implements ClazzService{
    // 对象类型
    private ClazzDAO clazzDAO;
    // 基本类型(含String和Date类型)
    private String name;
    private Integer age;
    private boolean sex;
    private double price;
    private float counts;
    private Date bir;

    // 基本类型(含String和Date类型)数组
    private String[] qqs;
    // 对象类型数组
    private ClazzDAO[] clazzDAOS;

    // list集合,集合中是基本类型(含String和Date类型)
    private List<String> habbies;
    // list集合,集合中是对象类型
    private List<ClazzDAO> clazzDAOList;

    // map集合,其中key和value都是基本类型(含String和Date类型)
    private Map<String, String> maps;
    // map集合,其中key和value都是对象类型
    private Map<ClazzDAO, ClazzDAO> map;

    // Properties类型
    private Properties properties;

    // set集合,内部是基本类型(含String和Date类型)
    private Set<String> sets;
    // set集合,内部是对象类型
    private Set<ClazzDAO> daoSet;

    public void setDaoSet(Set<ClazzDAO> daoSet) {
        this.daoSet = daoSet;
    }

    public void setSets(Set<String> sets) {
        this.sets = sets;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void setMap(Map<ClazzDAO, ClazzDAO> map) {
        this.map = map;
    }

    public void setMaps(Map<String, String> maps) {
        this.maps = maps;
    }

    public void setClazzDAOList(List<ClazzDAO> clazzDAOList) {
        this.clazzDAOList = clazzDAOList;
    }

    public void setHabbies(List<String> habbies) {
        this.habbies = habbies;
    }

    public void setClazzDAOS(ClazzDAO[] clazzDAOS) {
        this.clazzDAOS = clazzDAOS;
    }

    public void setQqs(String[] qqs) {
        this.qqs = qqs;
    }

    public void setBir(Date bir) {
        this.bir = bir;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public void setCounts(float counts) {
        this.counts = counts;
    }

    public void setSex(boolean sex) {
        this.sex = sex;
    }

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

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

    public void setClazzDAO(ClazzDAO clazzDAO) {
        this.clazzDAO = clazzDAO;
    }

    @Override
    public void save(String name) {
        System.out.println("Service name = " + name);
        clazzDAO.save(name);
        // 基本类型(含String和Date类型)的遍历
        System.out.println("Name = " + this.name);
        System.out.println("age = " + age);
        System.out.println("sex = " + sex);
        System.out.println("price = " + price);
        System.out.println("counts = " + counts);
        System.out.println("bir = " + bir);
        System.out.println("=========遍历数组==============");
        // 基本类型(含String和Date类型)数组的遍历
        for (String qq : qqs) {
            System.out.println(qq);
        }
        // 对象类型数组的遍历
        for (ClazzDAO dao : clazzDAOS) {
            System.out.println(dao);
        }
  
        System.out.println("=========遍历集合==============");
        // list类型的遍历,list中是基本类型(含String和Date类型)
        habbies.forEach(habby -> System.out.println("habby = " + habby));
        // list类型的遍历,list中是对象类型
        clazzDAOList.forEach(clazzDAO -> System.out.println("clazzDAO = " + clazzDAO));
        // map集合的遍历,map内部中key和value都是基本类型(含String和Date类型)
        maps.forEach((key, value) -> {
            System.out.println("key : " + key + "  value : " + value);
        });
        // map集合的遍历,map内部中key和value都是对象类型(含String和Date类型)
        map.forEach((key, value) -> {
            System.out.println("key : " + key + "   value : " + value);
        });
        // properties的遍历
        System.out.println("=========遍历properties集合==============");
        properties.forEach((key, value) -> {
            System.out.println("key = " + key + "  value = " + value);
        });
        System.out.println("=========遍历set集合==============");
        //  set类型的遍历,set中是基本类型(含String和Date类型)
        sets.forEach(s -> System.out.println("s = " + s));
        System.out.println("=========遍历set集合:里面是对象类型==============");
        //  set类型的遍历,set中是对象类型
        daoSet.forEach(dao -> System.out.println("dao = " + dao));
    }
}

用到的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">
    <!--管理DAO组件-->
    <bean class="setdi.ClazzDAOImpl" id="clazzDAO">

    </bean>

    <!--管理Service组件-->
    <bean class="setdi.ClazzServiceImpl" id="clazzService">
        <!--对象类型-->
        <property name="clazzDAO" ref="clazzDAO"/>
        <!--基本类型(含String和Date类型)的数组 -->
        <property name="name" value="张三"/>
        <property name="age" value="23"/>
        <property name="sex" value="true"/>
        <property name="counts" value="23.23"/>
        <property name="price" value="256.34"/>
        <property name="bir" value="2012/12/12 23:54:57"/>
        <!--基本类型(含String和Date类型)的数组-->
        <property name="qqs">
            <array>
                <value>小陈</value>
                <value>小三</value>
                <value>小胡</value>
                <value>小杨</value>
            </array>
        </property>
        <!--对象类型的数组-->
        <property name="clazzDAOS">
            <array>
                <ref bean="clazzDAO"/>
                <ref bean="clazzDAO"/>
                <ref bean="clazzDAO"/>
            </array>
        </property>
        <!--list集合,内部是基本类型(含String和Date类型)-->
        <property name="habbies">
            <list>
                <value>看书</value>
                <value>睡觉</value>
                <value>喝水</value>
            </list>
        </property>
        <!--list集合,内部是对象类型-->
        <property name="clazzDAOList">
            <list>
                <ref bean="clazzDAO"/>
                <ref bean="clazzDAO"/>
                <ref bean="clazzDAO"/>
            </list>
        </property>
        <!--map集合,key和value都是基本类型(含String和Date类型)-->
        <property name="maps">
            <map>
                <entry key="aa" value="xiaochen"/>
                <entry key="bb" value="小陈"/>
                <entry key="cc" value="xiaoming"/>
            </map>
        </property>
        <!--map集合,key和value都是对象类型-->
        <property name="map">
            <map>
                <entry key-ref="clazzDAO" value-ref="clazzDAO"/>
            </map>
        </property>
        <!--properties-->
        <property name="properties">
            <props>
                <prop key="111">aaa</prop>
                <prop key="222">bbb</prop>
                <prop key="333">ccc</prop>
            </props>
        </property>
        <!--set set中是基本类型(含String和Date类型)-->
        <property name="sets">
            <set>
                <value>aaaa</value>
                <value>bbbb</value>
            </set>
        </property>
        <!--set set中是对象类型-->
        <property name="daoSet">
            <set>
                <ref bean="clazzDAO"/>
            </set>
        </property>
    </bean>
</beans>

测试类

public class TestSpring {
    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("setdi/spring.xml");
        ClazzService clazzService = (ClazzService) context.getBean("clazzService");
        clazzService.save("小陈");
    }
}

结果

Service name = 小陈
DAO name = 小陈
Name = 张三
age = 23
sex = true
price = 256.34
counts = 23.23
bir = Wed Dec 12 23:54:57 CST 2012
=========遍历数组==============
小陈
小三
小胡
小杨
setdi.ClazzDAOImpl@3b0143d3
setdi.ClazzDAOImpl@3b0143d3
setdi.ClazzDAOImpl@3b0143d3
=========遍历集合==============
habby = 看书
habby = 睡觉
habby = 喝水
clazzDAO = setdi.ClazzDAOImpl@3b0143d3
clazzDAO = setdi.ClazzDAOImpl@3b0143d3
clazzDAO = setdi.ClazzDAOImpl@3b0143d3
key : aa  value : xiaochen
key : bb  value : 小陈
key : cc  value : xiaoming
key : setdi.ClazzDAOImpl@3b0143d3   value : setdi.ClazzDAOImpl@3b0143d3
=========遍历properties集合==============
key = 111  value = aaa
key = 222  value = bbb
key = 333  value = ccc
=========遍历set集合==============
s = aaaa
s = bbbb
=========遍历set集合:里面是对象类型==============
dao = setdi.ClazzDAOImpl@3b0143d3

在这里插入图片描述

6. 构造注入

# 1. 构造注入
		使用类中构造方法为类中成员变量赋值过程称之为构造注入

# 2. 构造注入语法
		1. 需要哪个类型就将谁声明为成员变量,并提供公开的构造方法
		2. 在配置文件中对应的组件标签内使用<constructor-arg>标签进行注入

构造注入中很多用法其实与SET注入语法类似,只是将SET方法改为了构造方法,并且在配置文件中将property标签改成了constructor-arg标签,并且需要使用constructor-arg标签内部的index属性

定义EmpDAO接口

在这里插入图片描述

定义实现类EmpDAOImpl

// 构造注入
public class EmpDAOImpl implements EmpDAO{

    // 构造注入语法
    private String name;
    private Integer age;
    private Date bir;
    
    private String[] qqs;
    private List<String> habbys;

    public EmpDAOImpl(String name, Integer age, Date bir, String[] qqs, List<String> habbys) {
        this.name = name;
        this.age = age;
        this.bir = bir;
        this.qqs = qqs;
        this.habbys = habbys;
    }

    public EmpDAOImpl() {
    }

    @Override
    public void save(String name) {
        System.out.println("name = " + name);
        System.out.println("this.name = " + this.name);
        System.out.println("this.age = " + this.age);
        System.out.println("this.bir = " + this.bir);
        System.out.println("========遍历数组==========");
        for (String qq : qqs) {
            System.out.println(qq);
        }
        System.out.println("========遍历list集合==========");
        habbys.forEach(habby -> {
            System.out.println("habby = " + habby);
        });
    }
}

在这里插入图片描述

配置文件

<!--管理DAO组件
    1.SET方式注入 注入时使用property标签
    2.构造方式注入 注入时使用constructor-arg标签
-->
<bean class="cdi.EmpDAOImpl" id="empDAO">
    <!--使用构造注入-->
    <constructor-arg index="0" name="name" value="小黑黑"/>
    <constructor-arg index="1" name="age" value="23"/>
    <constructor-arg index="2" name="bir" value="2012/12/12"/>
    <!--注入数组-->
    <constructor-arg index="3" name="qqs">
        <array>
            <value>小黑</value>
            <value>小名</value>
            <value>小陈</value>
        </array>
    </constructor-arg>
    <!--注入list-->
    <constructor-arg index="4" name="habbys">
        <list>
            <value>好人</value>
            <value>坏蛋</value>
            <value>小豆豆</value>
        </list>
    </constructor-arg>
</bean>

在这里插入图片描述

测试类

public class TestSpring {

    public static void main(String[] args) {
        // 启动工厂
        ApplicationContext context = new ClassPathXmlApplicationContext("cdi/spring.xml");

        EmpDAO empDAO = (EmpDAO) context.getBean("empDAO");

        empDAO.save("小明");
    }
}

结果

在这里插入图片描述

补充

构造注入的缺点:

  • 不够灵活,如果想要只对name属性赋值,那么必须提供一个只对name赋值的构造方法,而不能使用其它的构造方法。因此,如果想要对任意组合属性赋值,那么需要大量的构造方法,冗余度太大。

在这里插入图片描述

7. 自动注入

# 1. 自动注入
	  在spring工厂配置文件中通过制定自动注入方式 开启组件属性的自动赋值
	  
	  注意:
	  	  1. 底层使用原理也是SET方式注入
	  	  2. 自动注入需要在对应组件标签开启才能使用
	  	  3. 只能用于引用类型的注入|对象类型|组件类型的注入,不能用于基本类型的注入
	  	  
# 2. 自动注入语法
	   1. 需要谁将谁声明为成员变量,并提供SET方法
       2. 在对应组件标签中加入autowired 属性并指定自动注入方式即可完成注入

需要的StudentDAO接口

在这里插入图片描述

StudentDAO接口的实现类

在这里插入图片描述

需要的StudentService接口

在这里插入图片描述

StudentService接口的实现类

在这里插入图片描述

配置文件

<!--管理DAO组件-->
<bean class="adi.StudentDAOImpl" name="studentDAO"></bean>

<!--管理Service组件
    autowire:用来给组件中成员变量完成自动赋值操作
       autowire属性值有以下两种
            byType:根据类型完成自动注入 根据成员变量类型去工厂找 找到对应类型完成赋值 找不到不赋值
                    注意:如果工厂中存在多个类型一致的组件 使用类型自动注入会报错,这时候就需要使用根据名称自动注入了
            byName:根据名称完成自动注入 根据成员变量名字去工厂中获取与之一致的名字 找到对应的赋值 找不到不赋值
-->
<bean class="adi.StudentServiceImpl" name="studentService" autowire="byName"></bean>

在这里插入图片描述

注意:

  • 如果autowire="byName"表示从工厂中找bean标签的id和成员变量的名字一样的类
  • 如果autowire="byType"表示从工厂中找bean标签包含的类的类型和成员变量类型一样的类

在这里插入图片描述

补充

  • 工厂中所含的类表示的是所有由bean标签的class属性指向的类
  • 在使用根据类型自动注入时,如果工厂中的多个类都能与成员变量类型对应,则会报错,这时候就需要使用根据名字自动注入了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值