摘要:本篇解決執行腳本文件的問題。場景描述可以不看。解決方法處理器獲取備注關于為何會去執行,可以參考源碼默認拿和參考原文鏈接
本篇解決 Spring 執行SQL腳本(文件)的問題。
場景描述可以不看。
場景描述:
我在運行單測的時候,也就是 Spring 工程啟動的時候,Spring 會去執行 classpath:schema.sql(后面會解釋),我想利用這一點,解決一個問題:
一次運行多個測試文件,每個文件先后獨立運行,而上一個文件創建的數據,會對下一個文件運行時造成影響,所以我要在每個文件執行完成之后,重置數據庫,不單單是把數據刪掉,而 schema.sql 里面有 drop table 和create table。
解決方法:
//Schema 處理器 @Component public class SchemaHandler { private final String SCHEMA_SQL = "classpath:schema.sql"; @Autowired private DataSource datasource; @Autowired private SpringContextGetter springContextGetter; public void execute() throws Exception { Resource resource = springContextGetter.getApplicationContext().getResource(SCHEMA_SQL); ScriptUtils.executeSqlScript(datasource.getConnection(), resource); } } // 獲取 ApplicationContext @Component public class SpringContextGetter implements ApplicationContextAware { private ApplicationContext applicationContext; public ApplicationContext getApplicationContext() { return applicationContext; } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } }
備注:
關于為何 Spring 會去執行 classpath:schema.sql,可以參考源碼
org.springframework.boot.autoconfigure.jdbc.DataSourceInitializer#runSchemaScripts
private void runSchemaScripts() { Listscripts = getScripts("spring.datasource.schema", this.properties.getSchema(), "schema"); if (!scripts.isEmpty()) { String username = this.properties.getSchemaUsername(); String password = this.properties.getSchemaPassword(); runScripts(scripts, username, password); try { this.applicationContext .publishEvent(new DataSourceInitializedEvent(this.dataSource)); // The listener might not be registered yet, so don"t rely on it. if (!this.initialized) { runDataScripts(); this.initialized = true; } } catch (IllegalStateException ex) { logger.warn("Could not send event to complete DataSource initialization (" + ex.getMessage() + ")"); } } } /** * 默認拿 classpath*:schema-all.sql 和 classpath*:schema.sql */ private List getScripts(String propertyName, List resources, String fallback) { if (resources != null) { return getResources(propertyName, resources, true); } String platform = this.properties.getPlatform(); List fallbackResources = new ArrayList (); fallbackResources.add("classpath*:" + fallback + "-" + platform + ".sql"); fallbackResources.add("classpath*:" + fallback + ".sql"); return getResources(propertyName, fallbackResources, false); }
參考:https://github.com/spring-pro...
原文鏈接:
http://zhige.me/2019/02/28/20...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73482.html
摘要:使用框架各個組件實現一個在線聊天網頁,當有用戶連接,服務器監聽到用戶連接會使用推送最新用戶列表,有用戶斷開刷新在線列表,實時推送用戶聊天信息。根據請求頭是否等于判斷是否是。 使用Spring框架各個組件實現一個在線聊天網頁,當有用戶連接WebSocket,服務器監聽到用戶連接會使用Stomp推送最新用戶列表,有用戶斷開刷新在線列表,實時推送用戶聊天信息。引入Jetty服務器,直接嵌入整...
摘要:學習筆記使用很容易創建一個獨立運行運行內嵌容器準生產級別的基于框架的項目,使用你可以不用或者只需要很少的配置。異常消息如果這個錯誤是由異常引起的。錯誤發生時請求的路徑。 Spring-Boot 1.5 學習筆記 使用Spring Boot很容易創建一個獨立運行(運行jar,內嵌Servlet容器)、準生產級別的基于Spring框架的項目,使用Spring Boot你可以不用或者只需要很...
摘要:地址提供了對的支持,能夠讓我們很方便對關系型數據庫做集成測試。如果想要在打包的時候跳過集成測試,只需要。例子使用因為使用了來做集成測試,得益于其機制,不需要自己構建和的。 Github地址 Spring Test Framework提供了對JDBC的支持,能夠讓我們很方便對關系型數據庫做集成測試。 同時Spring Boot提供了和Flyway的集成支持,能夠方便的管理開發過程中產生...
閱讀 2847·2021-11-22 15:22
閱讀 19015·2021-09-22 15:00
閱讀 1433·2021-09-07 09:58
閱讀 1236·2019-08-30 13:01
閱讀 2408·2019-08-29 16:27
閱讀 2344·2019-08-26 13:25
閱讀 1618·2019-08-26 12:13
閱讀 934·2019-08-26 11:53