Spring——多种方式实现依赖注入

  在Spring的XML配置中,只有一种声明bean的方式:使用<bean>元素并指定class属性。Spring会从这里获取必要的信息来创建bean。

但是,在XML中声明DI时,会有多种可选的配置方式和风格,具体到setter方式、构造器方式和P命名空间方式。

一、使用setter进行注入

   

 

 二、使用构造注入 

  • 为POJO类创建带参的构造方法
  • 使用<constructor-arg>元素

  给原先的实体类添加构造,记得带着无参构造,这个问题在这里不细说

  

  Spring配置文件如下

<bean id="student" class="com.cmy.entity.StudentBean">
    <!--constructor-arg:代表构造函数中的一个参数 索引从0开始-->
    <constructor-arg type="java.lang.String" value="呵呵"></constructor-arg>
    <constructor-arg type="int" value="16"></constructor-arg>
</bean>

  注意:

     1、一个<constructor-arg>元素表示构造方法的一个参数,且使用时不区分顺序。

     2、通过<constructor-arg>元素的index 属性可以指定该参数的位置索引,位置 从0 开始。

     3、<constructor-arg>元素还提供了type 属性用来指定参数的类型,避免字符串和基本数据类型的混淆。

三、使用P命名空间进行注入

<bean id="student" class="com.cmy.entity.studentBean" p:name="呵呵" 
      p:age="16">
</bean>

  注意:

    1、P命名空间注入的方式也是使用setter方式注入,所有POJO类中必须存在对应的set方法

    2、 使用前需要在Spring的配置文件中引入p命名空间 xmlns:p="http://www.springframework.org/schema/p"

      AOP也同样如此,不过在idea中可以使用ctrl+Enter自动引入  xmlns:aop="http://www.springframework.org/schema/aop"

四、注入不同的类型

  

 

   这个关注第四点,POJO类如下:

public class Datetype {
    //数组
    private  String[]   arrays;
    //list
    private List<Integer> lists;
    //set
    private Set<Integer> sets;
    //map
    private Map<String,String> maps;
    //配置
    private Properties pros;

    public String[] getArrays() {
        return arrays;
    }

    public void setArrays(String[] arrays) {
        this.arrays = arrays;
    }

    public List<Integer> getLists() {
        return lists;
    }

    public void setLists(List<Integer> lists) {
        this.lists = lists;
    }

    public Set<Integer> getSets() {
        return sets;
    }

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

    public Map<String, String> getMaps() {
        return maps;
    }

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

    public Properties getPros() {
        return pros;
    }

    public void setPros(Properties pros) {
        this.pros = pros;
    }

    @Override
    public String toString() {
        return "Datetype{" +
                "arrays=" + Arrays.toString(arrays) +
                ", lists=" + lists +
                ", sets=" + sets +
                ", maps=" + maps +
                ", pros=" + pros +
                '}';
    }
}

  大配置文件:

<bean id="dateType" class="cn.spring.entity.Datetype">

        <property name="arrays">
            <array>
                <value>hehe</value>
                <value>haha</value>
            </array>
        </property>

        <property name="lists">
            <list>
                <value>1</value>
                <value>2</value>
            </list>
        </property>

        <property name="sets">
            <set>
                <value>3</value>
                <value>4</value>
            </set>
        </property>

        <property name="maps">
            <map>
                <entry key="c" value="才"></entry>
                <entry value="的" key="d"></entry>
            </map>
        </property>

        <property name="pros">
            <props>
                <prop key="a">啊</prop>
                <prop key="b">吧</prop>
            </props>
        </property>

    </bean>

  测试类:

      

  输出结果:

    

 

 五、域属性的自动注入

   在之前我们采用手动的域属性注入,即:

   

 

   这里采用自动注入,自动注入有两种方式:

  1.byName:保证域属性名字和bean的id一致

  2.byType:保证域属性的类型和bean的类型一致,与其相兼容的类型也不可以

  

 

posted @ 2019-10-28 15:49  萧然成长记  阅读(1715)  评论(0编辑  收藏  举报