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

}

}