参数化弹簧配置

时间:2018-03-01 15:29:13

标签: java spring

假设您有以下弹簧配置:

@Configuration
public class Config {
    @Bean
    public SomeBean someBean() {
        SomeBean someBean = new SomeBean();
        someBean.setVar("foobar");
        return someBean;
    }
}

然后我可以在其他类中使用此配置,例如通过@Import(Config.class)导入它。现在,假设您不想对字符串“foobar”进行硬编码,而是将其作为参数传递给该配置。我该怎么办?创建像@FooBarConfiguration(var = "foobar")这样的自定义注释会很不错。这可能吗?

2 个答案:

答案 0 :(得分:1)

@Ben答案是经典且更好的方法。但是,如果您不想使用属性文件,则可以使用@Bean。每个@Bean都包含您要注入的值。

完整代码示例:

@SpringBootApplication
public class So49053082Application implements CommandLineRunner {

    @Bean
    String beanValueFooBar() {
        return "fooBar";
    }

    @Bean
    String beanValueBarFoo() {
        return "barFoo";
    }

    private class SomeBean {

        private String var;

        public void setVar(final String var) {
            this.var = var;
        }
    }


    @Configuration
    public class Config {
        @Bean
        public SomeBean someBean(String beanValueBarFoo) {
            SomeBean someBean = new SomeBean();
            System.out.println(beanValueBarFoo);
            someBean.setVar(beanValueBarFoo);
            return someBean;
        }
    }

    @Override
    public void run(String... args) {

    }

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(So49053082Application.class, args);
        context.close();
    }

}

答案 1 :(得分:0)

考虑使用@Value注释:

@Configuration
public class Config {

    @Value("${myParamValue}")
    public String myParam;

    @Bean
    public SomeBean someBean() {
        SomeBean someBean = new SomeBean();
        someBean.setVar(myParam);
        return someBean;
    }
}

您需要以某种方式将参数放入环境中:使用OS环境,运行时参数或配置文件的各种技术都符合您的目的。