使用场景:在开发和生产环境某些实现代码差异很大,来回切换代码太麻烦。(甚至某些依赖必须只能在生产环境才能使用)所以采用了根据运行环境注入不同的bean的做法。
首先把有差异的代码抽离出来,以接口的形式提供。
/**
* @author jy
*/
public interface InfoTools {
/**
* 文章关键字匹配
* @param content
* @return
*/
String dealInfoEntity(String content);
/**
* 文字转语音
* @param content
* @param mainTitle
* @param infoId
*/
String wordToVoice(String content, String mainTitle, String infoId);
}
提供两套实现,一套生产,一套开发测试
生产:
@Slf4j
public class InfoToolsProImpl implements InfoTools {
// 生产环境才能使用的依赖
private final SecuritiesInfosService securitiesInfosService;
// 生产环境才能使用的依赖
private final AudioServiceAgent audioServiceAgent;
// 生产环境才能使用的依赖
@Autowired
UploadTools uploadTools;
public InfoToolsProImpl(){//从配置文件获取bean注入
ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext("/jsf.xml");
this.securitiesInfosService = (SecuritiesInfosService) appContext.getBean("securitiesInfos");
this.audioServiceAgent = (AudioServiceAgent)appContext.getBean("audioServiceAgent");
}
@Override
public String dealInfoEntity(String content) {
//具体业务代码
return "";
}
@Override
public String wordToVoice(String content, String mainTitle, String infoId) {
//具体业务代码
return "";
}
}
开发测试:
@Slf4j
public class InfoToolsImpl implements InfoTools {
@Override
public String dealInfoEntity(String content) {
//具体业务代码
return "";
}
@Override
public String wordToVoice(String content, String mainTitle, String infoId) {
//具体业务代码
return "";
}
}
再增加配置类:
@Slf4j
@Configuration
public class InfoToolsConfig implements EnvironmentAware {//实现EnvironmentAware接口
private Environment environment;
@Bean
public InfoTools infoTools() {
final String pro = "pro";
String[] profiles = environment.getActiveProfiles();//获取当前运行环境
if (pro.equals(profiles[0])) {//如果是生产环境,注入InfoToolsProImpl
log.info("注入InfoToolsProImpl");
return new InfoToolsProImpl();
} else {
log.info("注入InfoToolsImpl");
return new InfoToolsImpl();
}
}
@Override
public void setEnvironment(@NonNull Environment environment) {
this.environment = environment;
}
}
在使用时,只需要调用InfoTools接口的方法就可以了,InfoToolsConfig会根据不同的运行环境注入不同的实现类的。
使用:
@Autowired
InfoTools infoEntityApp;//自动注入接口
//在方法里直接调用
String keyWords = infoEntityApp.dealInfoEntity(content);