背景
存在這種情況:
我們需要開發(fā)一個組件擅耽,這個組件需要使用到數據庫活孩。但組件本身不知道會被使用什么環(huán)境(不知道數據庫),數據庫環(huán)境是由引入該組件的項目應用來決定的乖仇!
已知憾儒,引入該組件的項目都采用mybatis框架來操作數據庫
思路
直接使用該組件的宿主項目中存在的sqlSessionFactory對象來操作數據庫
方法
- 引入mybatis 的maven依賴,略
- 使用spring生命周期勾子方法乃沙,在spring啟動以后掃描本組件的需要使用的dao接口和xml配置
@Configuration
//spring掃描dao接口起趾,并生成代理bean
@MapperScan("com.example.mapper")
public class AutoConfigureCamunda implements InitializingBean{
private SqlSessionFactory sqlSessionFactory;
@Autowired
public AutoConfigureCamunda(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
@Override
public void afterPropertiesSet(){
org.apache.ibatis.session.Configuration configuration = sqlSessionFactory.getConfiguration();
String mapperXmlLocation = "mapper-camunda/ActGeCusFormMapper.xml";
try (InputStream mapperStream = Resources.getResourceAsStream(mapperXmlLocation)) {
XMLMapperBuilder xmlMapperBuilder = new XMLMapperBuilder(mapperStream, configuration, mapperXmlLocation, configuration.getSqlFragments());
xmlMapperBuilder.parse();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
- 增加自動掃描配置,創(chuàng)建META-INF/spring.factories文件警儒,并添加內容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.AutoConfigureCamunda
思考
這是我自己想到的一個方案训裆,但可能不是最佳實踐,歡迎同道討論,或如果有老師知道更好的方案边琉,希望可以告知属百,謝謝!