Using Marshaller and Unmarshaller

    你可以在各种情况下使用 Spring 的 OXM。在下面的例子中,我们用它把一个 Spring 管理的应用程序的设置作为一个 XML 文件来管理。在下面的例子中,我们用一个简单的 JavaBean 来表示这些设置:

    1. public class Settings {
    2. private boolean fooEnabled;
    3. public boolean isFooEnabled() {
    4. return fooEnabled;
    5. }
    6. public void setFooEnabled(boolean fooEnabled) {
    7. this.fooEnabled = fooEnabled;
    8. }
    9. }

    应用程序类使用这个 Bean 来存储其设置。除了一个 main 方法,该类还有两个方法:saveSettings() 将设置 Bean 保存到一个名为 settings.xml 的文件中,而 loadSettings()则再次加载这些设置。下面的 main()方法构建了一个 Spring 应用上下文并调用了这两个方法。

    1. import java.io.FileInputStream;
    2. import java.io.FileOutputStream;
    3. import java.io.IOException;
    4. import javax.xml.transform.stream.StreamResult;
    5. import javax.xml.transform.stream.StreamSource;
    6. import org.springframework.context.ApplicationContext;
    7. import org.springframework.context.support.ClassPathXmlApplicationContext;
    8. import org.springframework.oxm.Marshaller;
    9. import org.springframework.oxm.Unmarshaller;
    10. public class Application {
    11. private static final String FILE_NAME = "settings.xml";
    12. private Settings settings = new Settings();
    13. private Marshaller marshaller;
    14. private Unmarshaller unmarshaller;
    15. public void setMarshaller(Marshaller marshaller) {
    16. this.marshaller = marshaller;
    17. }
    18. public void setUnmarshaller(Unmarshaller unmarshaller) {
    19. this.unmarshaller = unmarshaller;
    20. }
    21. public void saveSettings() throws IOException {
    22. try (FileOutputStream os = new FileOutputStream(FILE_NAME)) {
    23. this.marshaller.marshal(settings, new StreamResult(os));
    24. }
    25. }
    26. public void loadSettings() throws IOException {
    27. try (FileInputStream is = new FileInputStream(FILE_NAME)) {
    28. this.settings = (Settings) this.unmarshaller.unmarshal(new StreamSource(is));
    29. }
    30. }
    31. public static void main(String[] args) throws IOException {
    32. ApplicationContext appContext =
    33. new ClassPathXmlApplicationContext("applicationContext.xml");
    34. Application application = (Application) appContext.getBean("application");
    35. application.saveSettings();
    36. application.loadSettings();
    37. }
    38. }

    这个应用环境使用了 XStream,但我们也可以使用本章后面描述的任何其他 marshaller实例。注意,在默认情况下,XStream 不需要任何进一步的配置,所以 Bean 的定义相当简单。还要注意的是,XStreamMarshaller 同时实现了 Marshaller 和 Unmarshaller,所以我们可以在应用程序的marshaller 和 unmarshaller 属性中都引用 xstreamMarshaller Bean。 :::tips 想要上面的程序可以运行,你需要在 spring ioc 环境下,添加这里用到的 oxm 和 xstream
    implementation group: ‘org.springframework’, name: ‘spring-oxm’, version: ‘5.3.15’
    // 其中 XStreamMarshaller 的实现又依赖了 xstream 包
    implementation group: ‘com.thoughtworks.xstream’, name: ‘xstream’, version: ‘1.4.19’ ::: 这个示例应用程序产生了以下 settings.xml 文件。

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <settings foo-enabled="false"/>

    我测试的时候由于这些类都有完整的类目,生成的如下:

    1. <cn.mrcode.study.springdocsread.data.Settings><fooEnabled>false</fooEnabled></cn.mrcode.study.springdocsread.data.Settings>
    • 没有 <?xml version="1.0" encoding="UTF-8"?>声明
    • 没有上图中那样的结构