##### Legend

- External Link
- Opens in a new window

## Composite Configuration Details

There are many use cases when you want to collect the properties of several configuration sources and access them like a single configuration object. One way to do that is using the `CompositeConfiguration` class.

A `CompositeConfiguration` object contains a list of other configuration objects. When properties are accessed from a composite configuration the object takes the passed in property key and iterates over the list of the contained configurations. As soon as a value is found for the key it is returned. This means that a `CompositeConfiguration` implements a kind of override semantics, i.e. the properties of configurations that were added first hide the property values of configurations added later.

We will discuss how you can establish a "default" choice for your Composite Configuration as well as save changes made to your Composite Configuration.

### Setting Up Defaults

Defaults are very simple. You can just add them as your last configuration object, either through the ConfigurationFactory or manually:

    Configuration defaults = new PropertiesConfiguration(fileToDefaults);
    Configuration otherProperties = new PropertiesConfiguration(fileToOtherProperties);
    CompositeConfiguration cc = new CompositeConfiguration();
    cc.addConfiguration(otherProperties);
    cc.addDefaults(fileToDefaults);

### Saving Changes

If you have a non static Configuration where you want to save changes made to a configuration, and you are using a CompositeConfiguration, then you will need to pass into the constructor of the CompositeConfiguration what Configuration to save the changes via.

    PropertiesConfiguration saveConfiguration = new PropertiesConfiguration(fileToSaveChangesIn);
    Configuration cc = new CompositeConfiguration(saveConfiguration);
    cc.setProperty("newProperty","new value");

    saveConfiguration.save();

Alternatively, you can just request the inMemoryConfiguration that stores the changes:

    Configuration changes = myCompositeConfiguration.getInMemoryConfiguration();
    DatabaseConfiguration config = new DatabaseConfiguration(datasource, "configuration", "key", "value");
    for (Iterator i = changes.getKeys().iterator();i.hasNext()){
    	String key = (key)i.next();
    	Object value = changes.get(key);
    	config.setProperty(key,value);
    }