使用标签配置
在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>
<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>
然后我们运行结果即可
|