在前兩天,Damon也是將springboot大概的狀況給大家介紹了不少乾巧,今天Damon就跟大家說說springboot框架的一些整合沟于,以及一些實用的插件介紹旷太,希望大家喜歡供璧。(最近由于實訓比較累【現在才10已經很目澀了】冻记,所以每日推薦也是比較慢冗栗,希望大家原諒隅居。)
Spring Boot 集成druid
druid有很多個配置選項,使用Spring Boot 的配置文件可以方便的配置druid棉钧。
在application.yml配置文件中寫上:
spring: datasource: name: test url: jdbc:mysql://192.168.16.137:3306/test username: root password: # 使用druid數據源 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver filters: stat maxActive: 20 initialSize: 1 maxWait: 60000 minIdle: 1 timeBetweenEvictionRunsMillis: 60000 minEvictableIdleTimeMillis: 300000 validationQuery: select 'x' testWhileIdle: true testOnBorrow: false testOnReturn: false poolPreparedStatements: true maxOpenPreparedStatements: 20
這里通過type: com.alibaba.druid.pool.DruidDataSource配置即可宪卿!
Spring Boot 集成MyBatis
- Spring Boot 集成MyBatis有兩種方式愧捕,一種簡單的方式就是使用MyBatis官方提供的:
mybatis-spring-boot-starter - 另外一種方式就是仍然用類似mybatis-spring的配置方式,這種方式需要自己寫一些代碼瘪阁,但是可以很方便的控制MyBatis的各項配置。
mybatis-spring-boot-starter方式
-
在pom.xml中添加依賴:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.0.0</version>
</dependency>
mybatis-spring-boot-starter依賴樹如下:
其中mybatis使用的3.3.0版本义黎,可以通過:
- <mybatis.version>3.3.0</mybatis.version>屬性修改默認版本廉涕。
- mybatis-spring使用版本1.2.3狐蜕,可以通過:
- <mybatis-spring.version>1.2.3</mybatis-spring.version>修改默認版本。
在application.yml中增加配置:
mybatis:
mapperLocations: classpath:mapper/*.xml
typeAliasesPackage: tk.mapper.model除了上面常見的兩項配置婆瓜,還有:
- mybatis.config:mybatis-config.xml配置文件的路徑
- mybatis.typeHandlersPackage:掃描typeHandlers的包
- mybatis.checkConfigLocation:檢查配置文件是否存在
- mybatis.executorType:設置執(zhí)行模式(SIMPLE, REUSE, BATCH)廉白,默認為SIMPLE
mybatis-spring方式
這種方式和平常的用法比較接近猴蹂。需要添加mybatis依賴和mybatis-spring依賴宵统。
-
然后創(chuàng)建一個MyBatisConfig配置類:
/** * MyBatis基礎配置 * * @author liuzh * @since 2015-12-19 10:11 */ @Configuration @EnableTransactionManagement public class MyBatisConfig implements TransactionManagementConfigurer { @Autowired DataSource dataSource; @Bean(name = "sqlSessionFactory") public SqlSessionFactory sqlSessionFactoryBean() { SqlSessionFactoryBean bean = new SqlSessionFactoryBean(); bean.setDataSource(dataSource); bean.setTypeAliasesPackage("tk.mybatis.springboot.model"); //分頁插件 PageHelper pageHelper = new PageHelper(); Properties properties = new Properties(); properties.setProperty("reasonable", "true"); properties.setProperty("supportMethodsArguments", "true"); properties.setProperty("returnPageInfo", "check"); properties.setProperty("params", "count=countSql"); pageHelper.setProperties(properties); //添加插件 bean.setPlugins(new Interceptor[]{pageHelper}); //添加XML目錄 ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { bean.setMapperLocations(resolver.getResources("classpath:mapper/*.xml")); return bean.getObject(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(e); } } @Bean public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } @Bean @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return new DataSourceTransactionManager(dataSource); }
}
上面代碼創(chuàng)建了一個SqlSessionFactory和一個SqlSessionTemplate瓢省,為了支持注解事務勤婚,增加了@EnableTransactionManagement注解馒胆,并且反回了一個PlatformTransactionManagerBean凝果。
-
另外應該注意到這個配置中沒有MapperScannerConfigurer器净,如果我們想要掃描MyBatis的Mapper接口,我們就需要配置這個類沿量,這個配置我們需要單獨放到一個類中冤荆。
/** * MyBatis掃描接口 * * @author liuzh * @since 2015-12-19 14:46 */ @Configuration //注意钓简,由于MapperScannerConfigurer執(zhí)行的比較早外邓,所以必須有下面的注解 @AutoConfigureAfter(MyBatisConfig.class) public class MyBatisMapperScannerConfig { @Bean public MapperScannerConfigurer mapperScannerConfigurer() { MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer(); mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory"); mapperScannerConfigurer.setBasePackage("tk.mybatis.springboot.mapper"); //配置通用mappers Properties properties = new Properties(); properties.setProperty("mappers", "tk.mybatis.springboot.util.MyMapper"); properties.setProperty("notEmpty", "false"); properties.setProperty("IDENTITY", "MYSQL"); //這里使用的通用Mapper的MapperScannerConfigurer坐榆,所有有下面這個方法 mapperScannerConfigurer.setProperties(properties); return mapperScannerConfigurer; } }
這個配置一定要注意@AutoConfigureAfter(MyBatisConfig.class)席镀,必須有這個配置,否則會有異常顶捷。原因就是這個類執(zhí)行的比較早服赎,由于sqlSessionFactory還不存在重虑,后續(xù)執(zhí)行出錯秦士。做好上面配置以后就可以使用MyBatis了隧土。
關于分頁插件和通用Mapper集成
- 分頁插件作為插件的例子在上面代碼中有。
- 通用Mapper配置實際就是配置MapperScannerConfigurer的時候使用- tk.mybatis.spring.mapper.MapperScannerConfigurer即可辐脖,配置屬性使用Properties嗜价。
Spring Boot集成MyBatis的基礎項目
- 分頁插件和通用Mapper的相關信息可以通過上面地址找到。
Spring Boot 靜態(tài)資源處理
Spring Boot 默認的處理方式就已經足夠了,默認情況下Spring Boot 使用WebMvcAutoConfiguration中配置的各種屬性奴拦。
建議使用Spring Boot 默認處理方式届吁,需要自己配置的地方可以通過配置文件修改疚沐。
-
但是如果你想完全控制Spring MVC,你可以在@Configuration注解的配置類上增加@EnableWebMvc痴施,增加該注解以后WebMvcAutoConfiguration中配置就不會生效辣吃,你需要自己來配置需要的每一項神得。這種情況下的配置方法建議參考WebMvcAutoConfiguration類偷仿。
-本文以下內容針對Spring Boot 默認的處理方式酝静,部分配置通過在application.yml配置文件中設置。
-.spring boot默認加載文件的路徑是/META-INF/resources/ /resources/ /static/ /public/ private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/" };
所有本地的靜態(tài)資源都配置在了classpath下面了, 而非在webapp下了
配置資源映射
- Spring Boot 默認配置的/映射到/static(或/public 全跨,/resources浓若,/META-INF/resources)挪钓,/webjars/會映射到
- classpath:/META-INF/resources/webjars/耳舅。
注意:上面的/static等目錄都是在classpath:下面。
-
如果你想增加如/mystatic/**映射到classpath:/mystatic/馏予,你可以讓你的配置類繼承WebMvcConfigurerAdapter霞丧,然后重寫如下方法:
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/mystatic/**") .addResourceLocations("classpath:/mystatic/"); }
- 這種方式會在默認的基礎上增加/mystatic/**映射到classpath:/mystatic/蛹尝,不會影響默認的方式,可以同時使用挫酿。
- 靜態(tài)資源映射還有一個配置選項早龟,為了簡單這里用.properties方式書寫:
spring.mvc.static-path-pattern=/** # Path pattern used for static resources.
這個配置會影響默認的/猫缭,例如修改為/static/后饵骨,只能映射如/static/js/sample.js這樣的請求(修改前是/js/sample.js)。這個配置只能寫一個值妖混,不像大多數可以配置多個用逗號隔開的制市。
使用注意
-
例如有如下目錄結構:
└─resources │ application.yml │ ├─static │ ├─css │ │ index.css │ │ │ └─js │ index.js │ └─templates index.ftl
在index.ftl中該如何引用上面的靜態(tài)資源呢祥楣?
如下寫法:
<link rel="stylesheet" type="text/css" href="/css/index.css">
<script type="text/javascript" src="/js/index.js"></script>注意:默認配置的/**映射到/static(或/public 误褪,/resources碾褂,/META-INF/resources)
當請求/css/index.css的時候正塌,Spring MVC 會在/static/目錄下面找到恤溶。
如果配置為/static/css/index.css咒程,那么上面配置的幾個目錄下面都沒有/static目錄帐姻,因此會找不到資源文件窥淆!
所以寫靜態(tài)資源位置的時候忧饭,不要帶上映射的目錄名(如/static/词裤,/public/吼砂,/resources/鼎文,/META-INF/resources/)拇惋!
使用WebJars
WebJars:http://www.webjars.org/
-
例如使用jquery,添加依賴:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>1.11.3</version>
</dependency> -
然后可以如下使用:
<script type="text/javascript"
src="/webjars/jquery/1.11.3/jquery.js"></script> 你可能注意到href中的1.11.3版本號了蓉坎,如果僅僅這么使用蛉艾,那么當我們切換版本號的時候還要手動修改href勿侯,怪麻煩的缴罗,我們可以用如下方式解決瞒爬。
-
先在pom.xml中添加依賴:
<dependency>
<groupId>org.webjars</groupId>
<artifactId>webjars-locator</artifactId>
</dependency> -
增加一個WebJarController:
@Controller public class WebJarController { private final WebJarAssetLocator assetLocator = new WebJarAssetLocator(); @ResponseBody @RequestMapping("/webjarslocator/{webjar}/**") public ResponseEntity locateWebjarAsset(@PathVariable String webjar, HttpServletRequest request) { try { String mvcPrefix = "/webjarslocator/" + webjar + "/"; String mvcPath = (String) request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE); String fullPath = assetLocator.getFullPath(webjar, mvcPath.substring(mvcPrefix.length())); return new ResponseEntity(new ClassPathResource(fullPath), HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } } }
-
然后使用的時候按照如下方式:
<script
type="text/javascript" src="/webjarslocator/jquery/jquery.js"></script> 注意:這里不需要在寫版本號了沟堡,但是注意寫url的時候航罗,只是在原來url基礎上去掉了版本號粥血,其他的都不能少酿箭!
靜態(tài)資源版本管理
Spring MVC 提供了靜態(tài)資源版本映射的功能。
用途:當我們資源內容發(fā)生變化時缔御,由于瀏覽器緩存耕突,用戶本地的靜態(tài)資源還是舊的資源评架,為了防止這種情況導致的問題,我們可能會手動在請求url的時候加個版本號或者其他方式上祈。
-
版本號如:
<script
type="text/javascript" src="/js/sample.js?v=1.0.1"></script> Spring MVC 提供的功能可以很容易的幫助我們解決類似問題雇逞。
Spring MVC 有兩種解決方式茁裙。
注意:下面的配置方式針對freemarker模板方式,其他的配置方式可以參考掉蔬。
資源名-md5 方式
<link rel="stylesheet" type="text/css" href="/css/index-2b371326aa93ce4b611853a309b69b29.css">
- Spring 會自動讀取資源md5女轿,然后添加到index.css的名字后面壕翩,因此當資源內容發(fā)生變化的時候,文件名發(fā)生變化北救,就會更新本地資源。
- 配置方式:
在application.properties中做如下配置:
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**這樣配置后托启,所有/**請求的靜態(tài)資源都會被處理為上面例子的樣子屯耸。
到這兒還沒完蹭劈,我們在寫資源url的時候還要特殊處理铺韧。
首先增加如下配置:
@ControllerAdvice
public class ControllerConfig {
@Autowired
ResourceUrlProvider resourceUrlProvider;
@ModelAttribute("urls")
public ResourceUrlProvider urls() {
return this.resourceUrlProvider;
}
}-
然后在頁面寫的時候用下面的寫法:
<link rel="stylesheet" type="text/css" href="${urls.getForLookupPath('/css/index.css')}">
使用urls.getForLookupPath('/css/index.css')來得到處理后的資源名祟蚀。
版本號 方式
在application.properties中做如下配置:
spring.resources.chain.strategy.fixed.enabled=true
spring.resources.chain.strategy.fixed.paths=/js/,/v1.0.0/
spring.resources.chain.strategy.fixed.version=v1.0.0這里配置需要特別注意割卖,將version的值配置在paths中。
-
在頁面寫的時候罢维,寫法如下:
<script
type="text/javascript" src="${urls.getForLookupPath('/js/index.js')}"></script> -
注意肺孵,這里仍然使用了urls.getForLookupPath平窘,urls配置方式見上一種方式凳怨。
在請求的實際頁面中,會顯示為:<script
type="text/javascript" src="/v1.0.0/js/index.js"></script> 可以看到這里的地址是/v1.0.0/js/index.js紫新。
靜態(tài)資源版本管理 處理過程
- 在Freemarker模板首先會調用urls.getForLookupPath方法芒率,返回一個/v1.0.0/js/index.js或/css/index-2b371326aa93ce4b611853a309b69b29.css篙顺。
- 這時頁面上的內容就是處理后的資源地址。這之后瀏覽器發(fā)起請求腋寨。
- 這里分開說。
第一種md5方式
- 請求/css/index-2b371326aa93ce4b611853a309b69b29.css萄窜,我們md5配置的paths=/**查刻,所以Spring MVC 會嘗試url中是否包含-,如果包含會去掉后面這部分普气,然后去映射的目錄(如/static/)查找/css/index.css文件现诀,如果能找到就返回仔沿。
第二種版本方式
- 請求/v1.0.0/js/index.js。
- 如果我們paths中沒有配置/v1.0.0封锉,那么上面這個請求地址就不會按版本方式來處理成福,因此會找不到上面的資源奴艾。
- 如果配置了/v1.0.0内斯,Spring 就會將/v1.0.0去掉再去找/js/index.js嘿期,最終會在/static/下面找到备徐。