spring ioc容器的启动有如下步骤:
1、定位、加载资源(ResourceLoader)
2、解析成spring认识的文档类型
3、解析成BeanDefinition(以bean的名称作为key,BeanDefinition作为value)放入ioc容器。
其中需要解析properties类型的文件,下面来介绍下spring是如何封装java.util.Properties的。(如果知道java.util.Properties的常见用法,非常容易理解)
先看测试实例:(其实使用java.util.Properties直接测试也是一样)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Properties;
import org.springframework.util.DefaultPropertiesPersister;
public class ResourceLoaderTest {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("D:/test/test.properties");
InputStream isXML = new FileInputStream("D:/test/test.xml");
OutputStream os = new FileOutputStream(new File("D:/test/test2.properties"));//为了测试方便我直接新建了test目录
OutputStream osXML = new FileOutputStream(new File("D:/test/test2.xml"));//为了测试方便我直接新建了test目录
Reader reader = new InputStreamReader(is);
Writer writer = new FileWriter(new File("D:/test/test3.properties"));
Properties props = new Properties();
DefaultPropertiesPersister dpp = new DefaultPropertiesPersister();
// dpp.load(props, is);//通过流的形式加载
// dpp.load(props, reader);//通过字符的形式加载
dpp.loadFromXml(props, isXML);
// dpp.store(props, os, "xxx");//通过流的形式转成properties文件
// dpp.store(props, writer, "这是我得测试");//通过字符的形式转成properties文件
// dpp.storeToXml(props, osXML, "xxxx");//"通过流的形式转成xml文件"
// dpp.storeToXml(props, osXML, "xxxx", "UTF-8");
System.out.println(props.get("Width"));
}
}
test.xml文件
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>Properties Example</comment>
<entry key="Width">15</entry>
<entry key="Height">200</entry>
</properties>
源码:
package org.springframework.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Properties;
//封装的接口,默认只有一个实现类,该实现类也只是将java.util.Properties进行了一层封装
public interface PropertiesPersister {
//流形式加载properties文件
void load(Properties props, InputStream is) throws IOException;
//字符形式加载properties文件
void load(Properties props, Reader reader) throws IOException;
//存为properties文件
void store(Properties props, OutputStream os, String header) throws IOException;
void store(Properties props, Writer writer, String header) throws IOException;
//从xml文件中加载
void loadFromXml(Properties props, InputStream is) throws IOException;
//properties保存为xml
void storeToXml(Properties props, OutputStream os, String header) throws IOException;
void storeToXml(Properties props, OutputStream os, String header, String encoding) throws IOException;
}
package org.springframework.util;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;
import java.util.Properties;
//直接调用java.util.Properties中的相应方法
public class DefaultPropertiesPersister implements PropertiesPersister {
@Override
public void load(Properties props, InputStream is) throws IOException {
props.load(is);
}
@Override
public void load(Properties props, Reader reader) throws IOException {
props.load(reader);
}
@Override
public void store(Properties props, OutputStream os, String header) throws IOException {
props.store(os, header);
}
@Override
public void store(Properties props, Writer writer, String header) throws IOException {
props.store(writer, header);
}
@Override
public void loadFromXml(Properties props, InputStream is) throws IOException {
props.loadFromXML(is);
}
@Override
public void storeToXml(Properties props, OutputStream os, String header) throws IOException {
props.storeToXML(os, header);
}
@Override
public void storeToXml(Properties props, OutputStream os, String header, String encoding) throws IOException {
props.storeToXML(os, header, encoding);
}
}