在运行时读取属性文件时注入bean

时间:2015-07-07 23:15:32

标签: java spring dependency-injection

假设我有一个类MailConsoleService和一个类MailSMTPService,它们都实现了MailService接口。我有一个类EmailJob,它从数据库加载用户并通过Spring注入的MailService实例发送电子邮件。

我怎样才能读取属性并在运行时确定要注入哪个MailService实现?显然,应用程序运行时,属性可能会发生变化。

我已经考虑创建一个工厂bean,它将正确的实例从弹簧容器返回到EmailJob,但我不知道如何实现它。

注意:我的所有bean都配置为Singleton范围,所以我想我必须至少更改为Prototype EmailJob

注意2:在工厂bean中,我怎样才能避免每次都读取属性文件?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以这样做:

@Component
public class Factory {

@Autowired
private MailService mailConsoleService;

@Autowired
private MailService mailSmtpService;

@Value("${mailServiceProperty}")
private String mailServiceProperty;

public MailService getMailService() {
    switch (mailServiceProperty) {
    case "CONSOLE":
        return mailConsoleService;

    case "SMTP":
        return mailSmtpService;
    }       
    return null;
}

}

此外,您需要使用PropertyPlaceholderConfigurer

注入属性

答案 1 :(得分:0)

我不确定我完全理解你的问题。但根据我的理解,如果你想在运行时从属性文件获取bean并且文件可以在运行时更改,那么下面是这样做的一种方法。您需要一个app上下文句柄,并从属性文件中获取bean名称。

原型范围与此无关。如果声明类型为prototype的bean,则意味着每次向应用程序上下文询问时都会获得一个新的bean实例。

@Component
public class EmailJob {  

    @Autowired
    private ApplicationContext appContext;

    public void sendEmail(){

        MailSender mailSender=(MailSender)appContext.getBean(<get bean name from properties file>);

        // do remaining things
    }


}