SSM学习——bean生命周期与依赖注入(3)

使用标签配置

在dao层实现类里定义init初始化与destroy销毁操作
在这里插入图片描述

然后需要在xml里面注册
在这里插入图片描述

这时候其实只能输出init,(只调用了初始化方法,因为destroy的时候jvm已经被关闭了,spring来不及destroy,这时候需要把入口函数的类型改成ClassPathXmlApplicationContext,然后写上关闭容器的.close()方法)
在这里插入图片描述

其实还可以替代.close()这种暴力方法:设置一个钩子,让jvm退出之前记得让spring在钩子处关闭一下
在这里插入图片描述

.close() ctx.registerShutdownHook()的区别:.close()是暴力的,如果放在了getBean方法上面,那就相当于加载完xml后就关闭容器,不执行getBean及以下的方法了,就会报错,而钩子函数 ctx.registerShutdownHook()可以随时放哪都行

在这里插入图片描述

由于多个bean的初始化与销毁会显得比较乱,那么spring就给了我们一套规则,让我们按照他的方法写,就不用再配置了

使用接口配置(了解)

我们在bookService里面调用一下spring给我们的两个接口:
在这里插入图片描述
在这里插入图片描述

bean经历的阶段

在这里插入图片描述

依赖注入

在这里插入图片描述

对应的,依赖注入也就有4种类型:1,setter注入(简单类型,引用类型)2,构造器注入(简单类型,引用类型)

setter注入——引用类型

在这里插入图片描述

当我们需要在一个bean中传入多个类型时候,需要这么做:
在这里插入图片描述
在这里插入图片描述

在service里面整合了2个dao层的实现方法
在这里插入图片描述
可以看到结果按顺序执行了

在这里插入图片描述

setter注入——简单类型

有时候需要传入简单类型供web使用

在这里插入图片描述

然后我们尝试打印一下这两个简单数据类型
在这里插入图片描述

这时候,我们还需要去xml里面配置下他们的properties
在这里插入图片描述

构造器注入

构造器注入莫非就是在service里面写一个构造函数
在这里插入图片描述

然后再到xml里面配置:
在这里插入图片描述

多参数的也很简单:
在这里插入图片描述

在这里插入图片描述

简单类型的也很简单:
在这里插入图片描述

在这里插入图片描述

但是如果将bean里面的2个标签的顺序反过来了,那么就会报错!
在这里插入图片描述

不过,对于databaseName这样的名字,在xml里面和Dao层实现类里面都是一样的,这说明他们的耦合度还是很高,因此需要改进:将name改成type(参数类型)
在这里插入图片描述

但是这样的话无法解决两个数据类型同样的问题,怎么办?又有一个新方法,便是位置(index)
在这里插入图片描述

这些都是兼容性方案,为了松耦合

依赖自动装配

在这里插入图片描述

首先我们建立一个使用setter注入的代码
在这里插入图片描述

在这里插入图片描述

然后我们对xml进行改造

在这里插入图片描述

只要我们这儿提供了数据类型以及set方法那么就能够自动装配
在这里插入图片描述

然后再运行一遍程序,发现可用,说明我们不需要自己写<property>

但是有种情况:当我们有同类型的进行装配时,就无法按type进行匹配了,就只能用按名称进行匹配了

在这里插入图片描述

集合注入

既然泛型和基本数据类型都可以注入了,那么常见的集合怎么注入呢:
现在有 数组 List Set Map Properties

我们在dao层的实现类里面已经写好了

package com.itheima.dao.impl;

import com.itheima.dao.BookDao;

import java.util.*;

public class BookDaoImpl implements BookDao {

    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;
    }




    public void save() {
        System.out.println("book dao save ...");

        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);
    }
}

现在xml也只是把这个实现类bean化了而已
<bean id="bookDao" class="com.itheima.dao.impl.BookDaoImpl"/>
在这里插入图片描述

现在,我们配置一下xml:

<property name="array">
            <array>
                <value>100</value>
                <value>200</value>
                <value>300</value>
            </array>
        </property>
        <property name="list">
            <list>
                <value>dwqod100</value>
                <value>eqw20ewe0ew</value>
                <value>30ewwew0</value>
            </list>
        </property>
        <!--        set自动去重,所以dikw会被过滤掉一个-->
        <property name="set">
            <set>
                <value>dwqop</value>
                <value>daw</value>
                <value>dikw</value>
                <value>dikw</value>
            </set>
        </property>
        <property name="map">
            <map>
                <entry key="country" value="CHN"/>
                <entry key="province" value="ZJG"/>
                <entry key="city" value="HZ"/>
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="country">CHN</prop>
                <prop key="province">ZJG</prop>
                <prop key="city">HZ</prop>
            </props>
        </property>

然后我们运行结果即可
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值