# Injecting Properties Into Java EE Applications

To make basic datatypes injectable into POJOs, like:



    @Inject
    private String greeting;

    @Inject
    private int intValue;




...you will have to expose them first. The name of field may act as the lookup key:



//...

import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.inject.Inject;

public class Configurator {

	//...

    @Inject
    Instance<Map<String, String>> initialValues;

    public void init() {
        this.store = //...
        for (Map<String, String> initial : initialValues) {
            this.store.putAll(initial);
        }
    }


    @Produces
    public String getString(InjectionPoint ip) {
        String className = ip.getMember().getDeclaringClass().getName();
        String key = className + "." + ip.getMember().getName();
        String fieldName = computeKeyName(ip.getAnnotated(), key);
        return this.store.get(fieldName);
    }

    String computeKeyName(Annotated annotated, String key) {
        Configurable annotation = annotated.getAnnotation(Configurable.class);
        return annotation == null ? key : annotation.value();

    }

    @Produces
    public long getLong(InjectionPoint ip) {
        String stringValue = getString(ip);
        if (stringValue == null) {
            return 0;
        }
        return Long.parseLong(stringValue);
    }
}




The conventional field name as lookup key can be overridden with an annotation:


    @Inject
    @Configurable("msg")
	String message;





The annotation is expects a single string which is going to be used as a key:



@Target({ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Configurable {
    String value();
}




Now you only need to expose a datasource of your choice as Map<String, String>, 
like e.g. environment variables or System-properties to make them injectable:



import javax.enterprise.inject.Produces;

public class Initializer {

    @Produces
    public Map<String, String> getInitialConfiguration() {
    	//...fetch properties from wherever you like
    }
}



"How to inject properties into Java EE apps" was one of the questions in the recent airhacks.tv.


The code above was taken from JCache Configurator for Java EE -- a one-class Java EE framework. See also the Java Magazine article Convention Over Configuration in Java EE 6.



See you at Java EE Workshops at Munich Airport, Terminal 2 or Virtual Dedicated Workshops / consulting. Is Munich's airport too far? Learn from home: airhacks.io.
