SSM框架学习——Spring之依赖注入方式

目录

依赖注入方式

思考

依赖注入方式类型

setter注入

引用类型

简单类型 

构造器注入 

引用类型

简单类型

参数适配 

依赖注入方式选择 

集合注入 

示例 


依赖注入方式

思考

1.向一个类中传递数据的方式有几种?

        ①普通方法(set方法)

        ②构造方法

2.依赖注入描述了在容器中建立bean与bean之间依赖关系的过程,如果bean运行需要的是数字或字符串呢?

        ①引用类型

        ②简单类型(基本数据类型和String,这不是说数据类型,String为引用数据类型)

依赖注入方式类型

1.setter注入

        ①简单类型

        ②引用类型

2.构造器注入

        ①简单类型

        ②引用类型

setter注入

引用类型

①在bean中定义引用类型属性并提供可访问的set方法

public class ServiceImpl1 implements Service1 {
    //删除业务层中使用new方式创建的dao对象
    private Dao1 dao1;

    @Override
    public void show() {
        System.out.println("Service...");
        dao1.show();
        dao2.show();
    }
    //提供对应的set方法
    public void setDao1(Dao1 dao1) {
            System.out.println("set...");
        this.dao1 = dao1;
    }
}

②配置中使用property标签ref属性注入引用类型对象

<bean id="Dao1" class="Dao.impl.DaoImpl1"/>
<bean id="Service1" class="Service.impl.ServiceImpl1">
    <property name="dao1" ref="Dao1"/>
</bean>

简单类型 

①在bean中定义引用类型属性并提供可访问的set方法

public class DaoImpl1 implements Dao1 {
    private int Num;
    private String Name;

    public void setNum(int num) {
        this.Num= num;
    }

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

②配置中使用property标签value属性注入简单类型数据

<bean id="Dao1" class="Dao.impl.DaoImpl1">
    <property name="Num" value="2"/>
    <property name="Name" value="ylm"/>
</bean>

构造器注入 

引用类型

①在bean中定义引用类型属性并提供可访问的构造方法

public class ServiceImpl1 implements Service1 {
    private Dao1 dao1;
    private Dao2 dao2;

    public ServiceImpl1(Dao1 dao1, Dao2 dao2) {
        this.dao1 = dao1;
        this.dao2 = dao2;
    }
}

②配置中使用constructor-arg标签ref属性注入引用类型对象

<bean id="Service1" class="Service.impl.ServiceImpl1">
    <property name="dao1" ref="Dao1"/>-->
    <property name="dao2" ref="Dao2"/>-->

    <!--name 指的是构造方法中形参的名字-->
    <constructor-arg name="dao1" ref="Dao1"/>
    <constructor-arg name="dao2" ref="Dao2"/>
</bean>

简单类型

①在bean中定义引用类型属性并提供可访问的set方法

public class DaoImpl2 implements Dao2 {
    private int Num;
    private String Name;

    public DaoImpl2(int num, String name) {
        this.Num = num;
        this.Name = name;
    }
}

②配置中使用constructor-arg标签value属性注入简单类型数据

<bean id="Dao2" class="Dao.impl.DaoImpl2" init-method="init" destroy-method="destory">
    <!--name有顺序对应构造中参数,我反过就报错了-->
    <constructor-arg name="num" value="19"/>
    <constructor-arg name="name" value="ylm"/>
</bean>

参数适配 

配置中使用constructor-arg标签type属性设置按形参类型注入

<bean id="Dao2" class="Dao.impl.DaoImpl2" init-method="init" destroy-method="destory">
    <!--这样就没有顺序,同时也不需要关注构造器的形参的名字,降低耦合-->
    <constructor-arg type="java.lang.String" value="ylm"/>
    <constructor-arg type="int" value="19"/>
</bean>

配置中使用constructor-arg标签index属性设置按形参位置注入

<bean id="Dao2" class="Dao.impl.DaoImpl2" init-method="init" destroy-method="destory">
    <!--index对应构造方法中的形参的位置-->
    <constructor-arg index="0" value="19"/>
    <constructor-arg index="1" value="ylm"/>
</bean>

依赖注入方式选择 

1.强制依赖使用构造器进行,使用setter注入有概率不进行注入导致null对象出现

2.可选依赖使用setter注入进行,灵活性强
3. Spring框架倡导使用构造器,第三方框架内部大多数采用构造器注入的形式进行数据初始化,相对严谨

4.如果有必要可以两者同时使用,使用构造器注入完成强制依赖的注入,使用setter注入完成可选依赖的注入

5.实际开发过程中还要根据实际情况分析,如果受控对象没有提供setter方法就必须使用构造器注入
6.自己开发的模块推荐使用setter注入

总结:建议使用setter注入,第三方技术根据情况选择

集合注入 

①数组对象

②List对象

③Set对象

④Map对象

⑤Properties对象

示例 

 配置

<bean id="Dao3" class="Dao.impl.DaoImpl3">
        <property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
                <ref bean="beanId"/>
            </array>
        </property>
        <property name="list">
            <list>
                <value>ylm</value>
                <value>200</value>
                <value>zxn</value>
            </list>
        </property>
        <property name="set">
            <set>
                <value>100</value>
                <value>200</value>
                <value>300</value>
                <value>300</value>
                <value>zxn</value>
                <value>zxn</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="1" value="string"/>
                <entry key="2" value="100"/>
                <entry key="3" value="200.00"/>
                <entry key="4" value="1231"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="1">100</prop>
                <prop key="2">zxn</prop>
                <prop key="3">ylm</prop>
            </props>
        </property>
    </bean>

Dao

public class DaoImpl3 implements Dao3 {
    private int[] array;
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;
    private Properties properties;

    public void setArray(int[] array) {this.array = array;}
    public void setList(List<String> list) {this.list = list;}
    public void setSet(Set<String> set) {this.set = set;}
    public void setMap(Map<String, String> map) {this.map = map;}
    public void setProperties(Properties properties) {this.properties = properties;}

    @Override
    public void show() {
        System.out.println("遍历数组:"+ Arrays.toString(array));
        System.out.println("遍历list:"+list);
        System.out.println("遍历set:"+set);
        System.out.println("遍历map:"+map);
        System.out.println("遍历properties:"+properties);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Lyle

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值