We look into the Spring Configurator a bit more, because we have not seen all of the possibilities. If we read the previous parts (part 1, part 2, part 3, part 4) we already experienced the power of the Spring Configurator. In this part we learn how to add our own properties to the configurator.
It is a good idea to extract settings from the Java code and externalize into a configuration file. This configuration file can be a Java properties file. In the application we can load the properties files and use the property values in our code. This mechanism is very easy to implement with the Spring Configurator. The only thing we need to do is place the Java properties file at a certain location and inject the Spring Configurator settings object in our application. Every property in the properties file is then available via the Spring Configurator.
Let's see how this works with our example. First we create a new property file at src/main/resources/META-INF/cocoon/properties/settings.properties and define the property machine:
machine=My muscle machine
We change our Sample class so we can display the value of this property (see lines 28-30):
package com.mrhaki.netbeans.mavenapp;
import org.apache.cocoon.configuration.Settings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Sample {
private Settings settings;
private String text;
private int timeout = 1000;
@Autowired
public void setSettings(Settings settings) {
this.settings = settings;
}
public void setText(String name) {
this.text = name;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public String getMachine() {
return settings.getProperty("machine");
}
@Override
public String toString() {
return "Running in [" + settings.getRunningMode() + "] mode. "
+ "Text = [" + text + "] and timeout = [" + timeout + "].";
}
}
The Settings class has two methods to get properties:
getProperty(String propertyName)to get the value for the property with propertyNamegetProperty(String propertyName, String defaultValue)to get the value for the property and if it is not found use a default value
To test if we really get the value for our property we change our test class to output the property value:
package com.mrhaki.netbeans.mavenapp;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class AppTest extends TestCase {
public AppTest(String testName) {
super(testName);
}
public static Test suite() {
return new TestSuite(AppTest.class);
}
public void testApp() {
final ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");
System.out.println(((Sample)appContext.getBean("sample")).getMachine());
}
}
If we run the test (mvn test) we get the following output:
Muscle machine
But wait that is not all. If we use the Settings object we also have access to the standard Java system properties and environment variables. The Java system properties can be accessed with their property name. The environment variables are prefixed with env.:
System.out.println(settings.getProperty("os.name"); // Output: Windows Vista
System.out.println(settings.getProperty("env.PROMPT"); // Output: $p$gIn this part we have learned how to access our own defined properties, Java system properties and environment variables.