假设我有一个类MailConsoleService
和一个类MailSMTPService
,它们都实现了MailService
接口。我有一个类EmailJob
,它从数据库加载用户并通过Spring注入的MailService实例发送电子邮件。
我怎样才能读取属性并在运行时确定要注入哪个MailService
实现?显然,应用程序运行时,属性可能会发生变化。
我已经考虑创建一个工厂bean,它将正确的实例从弹簧容器返回到EmailJob
,但我不知道如何实现它。
注意:我的所有bean都配置为Singleton范围,所以我想我必须至少更改为Prototype EmailJob
。
注意2:在工厂bean中,我怎样才能避免每次都读取属性文件?
谢谢!
答案 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
}
}