spring的依赖注入的四种方式,数组与集合注入;引用注入;内部bean注入


三种注入方式

第一种: 基于构造函数

 hi.java (bean)

package test_one;

public class hi {
    private String name;
    public hi(String name) {
        this.name=name;
    }
    public void sayhi() {
        System.out.println("你好呀 "+this.name);
    }

}
<bean id="binbin" class="test_one.hi" scope="singleton">
    <constructor-arg name="name" value="斌斌"/>
bean>

 上面是通过配置文件注入字符串

我们来看看如何注入bean

<bean id="binbin" class="test_one.hi" scope="singleton">
    <constructor-arg  ref="No"/>
bean>
<bean id="No" class="test_one.no">bean>
<bean id="binbin" class="test_one.hi" scope="singleton" p:name="斌斌" p:age="17" p:a-ref="No">bean> <bean id="No" class="test_one.no" p:name="明明">bean>

 第四种:使用c命名空间注入

与p命名空间注入一样,不过是基于构造函数注入

xmlns:c="http://www.springframework.org/schema/c"
<bean id="C" class="test_one.c_name" c:name="i'm c"/>

如果注入的是数组,List , Set , map, Properties

hi.java (bean)

package test_one;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class hi {
    private String[] myStrs;
    private List myList;
    private Set mySet;
    private Map myMap;
    private Properties myProps;

    public void setMyStrs(String[] myStrs) {
        this.myStrs = myStrs;
    }
    public void setMyList(List myList) {
        this.myList = myList;
    }
    public void setMySet(Set mySet) {
        this.mySet = mySet;
    }
    public void setMyMap(Map myMap) {
        this.myMap = myMap;
    }
    public void setMyProps(Properties myProps) {
        this.myProps = myProps;
    }
    
    public String[] getMyStrs() {
        return myStrs;
    }
    public List getMyList() {
        return myList;
    }
    public Set getMySet() {
        return mySet;
    }
    public Map getMyMap() {
        return myMap;
    }
    public Properties getMyProps() {
        return myProps;
    }

    public void print() {
        System.out.println("array:"+myStrs[0]+" "+myStrs[1]+"\nList:"+myList+"\nSet:"+mySet+"\nMap:"+myMap+"\nProperties:"+myProps);
    }


}

<bean id="binbin" class="test_one.hi" scope="singleton">

<property name="myStrs">
    <array>
        <value>array_onevalue>
        <value>array_twovalue>
    array>
property>

<property name="myList">
    <array>
        <value>List_onevalue>
        <value>List_twovalue>
    array>
property>

<property name="mySet">
    <list>
        <value>1314value>
        <value>520value>
    list>
property>

<property name="myMap">
    <props>
        <prop key="testA">map_oneprop>
        <prop key="testB">map_twoprop>
    props>
property>

<property name="myProps">
    <map>
        <entry key="testA" value="properties_one"/>
        <entry key="testB">
            <value>properties_twovalue>
        entry>
    map>
property>
bean>

可以发现我将array, list,set 的元素混用了,将map和props混用了

也就是说 array,list ,set之间可以混用,map与props之间可以混用。 不过在实际开发时还是元素和数据类型对应使用

 如果集合的数据类型是其他类型,在配置文件中,会自动将value的值转化为对应类型

注入Properties数据的另一种方式,更加简便

key=value 的写法


<property name="myProps">
    <value>
        testA=Properties_one
        testB=Properties_two
    value>
property>

 引用bean注入

参考:https://www.cnblogs.com/CloudComputing-binbin/p/15939822.html

内部bean注入

内部bean也称为内部匿名bean, 如果需要注入bean并且只用于一个特定的属性,建议使用内部bean

内部bean无法被外部bean引用,哪怕你加上id,她会无视scope标签

<bean id="binbin" class="test_one.hi" scope="singleton">

<property name="myStrs">
    <array>
        <bean class="test_one.no" parent="parent"/>
    array>
property>
bean>

那个内部bean是通过抽象bean注入的,想了解抽象bean请参考:

 Null以及空字符的值

<bean class="ExampleBean">
    <property name="email" value=""/>
bean>

什么示例与下列java代码效果一样

ExampleBean.setEmail("");

元素表示null(空指针)

<bean class="ExampleBean">
    <property name="email">
        <null/>
    property>
bean>

与下面的java代码效果一样

ExampleBean.setEmail(null);