I am working on command line application and I wanted to pass parameters from command line (read using Commons CLI) to member variables using annotation @Value.
package my.test; import
java.util.Properties;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.env.PropertiesPropertySource;
@Configuration @ComponentScan(value = { "my.test.components" })
public class DIConfiguration {
public static AnnotationConfigApplicationContext createContext(Properties properties) {
PropertiesPropertySource propertiesSource = new PropertiesPropertySource("test", properties);
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getEnvironment().getPropertySources().addLast(propertiesSource);
context.register(DIConfiguration.class); context.refresh();
return context;
}
public DIConfiguration() {
}
@Bean public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
Then simply annotate your fields:
package my.test.components;
import java.io.File;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class EmulatorConfig {
@Value("${test.testFile}")
private File testFile;
}
And use it:
Properties properties = new Properties(); //in real case fill properties by command line parameters
properties.put("test.testFile", new File("test.txt"));
properties.put("test.testInt", 15);
properties.put("test.testBool", true);
AnnotationConfigApplicationContext context = DIConfiguration.createContext(properties); ....