Key expansion is very useful in real
time applications. Suppose you are maintaining three different configurations
for production, beta, testing. You may need to maintain three property files
like production.properties, beta.properties, test.properties. When you are
going for production, you should load production.properties, when you are going
for beta, you should load beta.properties and when you are going fo testing,
you should load test.properties
production.properties
server.endPoint = "http://abc.prod.com/getMe" server.host = devHost server.user = devUser
beta.properties
server.endPoint = "http://abc.beta.com/getMe" server.host = betaHost server.user = betaUser
test.properties
server.endPoint = "http://abc.test.com/getMe" server.host = testHost server.user = testUser
What
is the problem with above approach?
First of all you are maintaining three
configuration files, what if you want to release beta2, beta3 etc., you are
going to add two more configuration files, and you need to change your code to
load specific files depends on your deployment (Whether it is production,
testing, beta etc.,).
How
can variable expansion solve my issue?
It is simple, define all the
properties in one file, Use another property to specify the Environment.
ProjectConfig.properties
#production.properties server.production.endPoint = "http://abc.prod.com/getMe" server.production.host = devHost server.production.user = devUser #beta.properties server.beta.endPoint = "http://abc.beta.com/getMe" server.beta.host = betaHost server.beta.user = betaUser #test.properties server.test.endPoint = "http://abc.test.com/getMe" server.test.host = testHost server.test.user = testUser #Setting up Environment environment = test
import org.aeonbits.owner.Config; public interface ProjectConfig extends Config { @DefaultValue("test") String environment(); @Key("server.${environment}.endPoint") String endPoint(); @Key("server.${environment}.host") String host(); @Key("server.${environment}.user") String user(); } import org.aeonbits.owner.ConfigFactory; public class PropertyUtil { public static void main(String args[]) throws Exception { ProjectConfig cfg = ConfigFactory.create(ProjectConfig.class); System.out.println(cfg.environment()); System.out.println(cfg.endPoint()); System.out.println(cfg.host()); System.out.println(cfg.user()); } }
Output
test "http://abc.test.com/getMe" testHost testUser
If you want
to move to production, update the environment property in ProjectConfig.properties
to production like below.
#Setting up
Environment
environment
= production
Re run PropertyUtil.java,
you will get following output.
production
"http://abc.prod.com/getMe"
devHost
devUser
No comments:
Post a Comment