雖然默認配置已經可以使用SpringMVC了,不過我們有時候需要進行自定義配置。
1.1.1.修改端口
查看SpringBoot的全局屬性可知,端口通過以下方式配置:
# 映射端口
server.port=80
重啓服務後測試:
1.1.2.訪問靜態資源
現在,我們的項目是一個jar工程,那麼就沒有webapp,我們的靜態資源該放哪裏呢?
回顧我們上面看的源碼,有一個叫做ResourceProperties的類,裏面就定義了靜態資源的默認查找路徑:
默認的靜態資源路徑爲:
- classpath:/META-INF/resources/
- classpath:/resources/
- classpath:/static/
- classpath:/public
只要靜態資源放在這些目錄中任何一個,SpringMVC都會幫我們處理。
我們習慣會把靜態資源放在classpath:/static/
目錄下。我們創建目錄,並且添加一些靜態資源:
重啓項目後測試:
1.1.3.添加攔截器
攔截器也是我們經常需要使用的,在SpringBoot中該如何配置呢?
攔截器不是一個普通屬性,而是一個類,所以就要用到java配置方式了。在SpringBoot官方文檔中有這麼一段說明:
If you want to keep Spring Boot MVC features and you want to add additional MVC configuration (interceptors, formatters, view controllers, and other features), you can add your own
@Configuration
class of typeWebMvcConfigurer
but without@EnableWebMvc
. If you wish to provide custom instances ofRequestMappingHandlerMapping
,RequestMappingHandlerAdapter
, orExceptionHandlerExceptionResolver
, you can declare aWebMvcRegistrationsAdapter
instance to provide such components.If you want to take complete control of Spring MVC, you can add your own
@Configuration
annotated with@EnableWebMvc
.
翻譯:
如果你想要保持Spring Boot 的一些默認MVC特徵,同時又想自定義一些MVC配置(包括:攔截器,格式化器, 視圖控制器、消息轉換器 等等),你應該讓一個類實現
WebMvcConfigurer
,並且添加@Configuration
註解,但是千萬不要加@EnableWebMvc
註解。如果你想要自定義HandlerMapping
、HandlerAdapter
、ExceptionResolver
等組件,你可以創建一個WebMvcRegistrationsAdapter
實例 來提供以上組件。如果你想要完全自定義SpringMVC,不保留SpringBoot提供的一切特徵,你可以自己定義類並且添加
@Configuration
註解和@EnableWebMvc
註解
總結:通過實現WebMvcConfigurer
並添加@Configuration
註解來實現自定義部分SpringMvc配置。
首先我們定義一個攔截器:
public class LoginInterceptor implements HandlerInterceptor {
private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
logger.debug("preHandle method is now running!");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
logger.debug("postHandle method is now running!");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
logger.debug("afterCompletion method is now running!");
}
}
然後,我們定義配置類,註冊攔截器:
@Configuration
public class MvcConfig implements WebMvcConfigurer{
/**
* 通過@Bean註解,將我們定義的攔截器註冊到Spring容器
* @return
*/
@Bean
public LoginInterceptor loginInterceptor(){
return new LoginInterceptor();
}
/**
* 重寫接口中的addInterceptors方法,添加自定義攔截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 通過registry來註冊攔截器,通過addPathPatterns來添加攔截路徑
registry.addInterceptor(this.loginInterceptor()).addPathPatterns("/**");
}
}
結構如下:
接下來運行並查看日誌:
你會發現日誌中什麼都沒有,因爲我們記錄的log級別是debug,默認是顯示info以上,我們需要進行配置。
SpringBoot通過logging.level.*=debug
來配置日誌級別,*填寫包名
# 設置com.leyou包的日誌級別爲debug
logging.level.com.leyou=debug
再次運行查看:
2018-05-05 17:50:01.811 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : preHandle method is now running!
2018-05-05 17:50:01.854 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : postHandle method is now running!
2018-05-05 17:50:01.854 DEBUG 4548 --- [p-nio-80-exec-1] com.leyou.interceptor.LoginInterceptor : afterCompletion method is now running!
1.2.整合jdbc和事務
spring中的jdbc連接和事務是配置中的重要一環,在SpringBoot中該如何處理呢?
答案是不需要處理,我們只要找到SpringBoot提供的啓動器即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
當然,不要忘了數據庫驅動,SpringBoot並不知道我們用的什麼數據庫,這裏我們選擇MySQL:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
至於事務,SpringBoot中通過註解來控制。就是我們熟知的@Transactional
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User queryById(Long id){
return this.userMapper.selectByPrimaryKey(id);
}
@Transactional
public void deleteById(Long id){
this.userMapper.deleteByPrimaryKey(id);
}
}
1.3.整合連接池
其實,在剛纔引入jdbc啓動器的時候,SpringBoot已經自動幫我們引入了一個連接池:
HikariCP應該是目前速度最快的連接池了,我們看看它與c3p0的對比:
因此,我們只需要指定連接池參數即可:
# 連接四大參數
spring.datasource.url=jdbc:mysql://localhost:3306/heima
spring.datasource.username=root
spring.datasource.password=123
# 可省略,SpringBoot自動推斷
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.hikari.idle-timeout=60000
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=10
當然,如果你更喜歡Druid連接池,也可以使用Druid官方提供的啓動器:
<!-- Druid連接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.6</version>
</dependency>
而連接信息的配置與上面是類似的,只不過在連接池特有屬性上,方式略有不同:
#初始化連接數
spring.datasource.druid.initial-size=1
#最小空閒連接
spring.datasource.druid.min-idle=1
#最大活動連接
spring.datasource.druid.max-active=20
#獲取連接時測試是否可用
spring.datasource.druid.test-on-borrow=true
#監控頁面啓動
spring.datasource.druid.stat-view-servlet.allow=true
1.4.整合mybatis
1.4.1.mybatis
SpringBoot官方並沒有提供Mybatis的啓動器,不過Mybatis官網自己實現了:
<!--mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
配置,基本沒有需要配置的:
# mybatis 別名掃描
mybatis.type-aliases-package=com.heima.pojo
# mapper.xml文件位置,如果沒有映射文件,請註釋掉
mybatis.mapper-locations=classpath:mappers/*.xml
需要注意,這裏沒有配置mapper接口掃描包,因此我們需要給每一個Mapper接口添加@Mapper
註解,才能被識別。
@Mapper
public interface UserMapper {
}
1.4.2.通用mapper
通用Mapper的作者也爲自己的插件編寫了啓動器,我們直接引入即可:
<!-- 通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
</dependency>
不需要做任何配置就可以使用了。
@Mapper
public interface UserMapper extends tk.mybatis.mapper.common.Mapper<User>{
}
1.5.啓動測試
將controller進行簡單改造:
@RestController
public class HelloController {
@Autowired
private UserService userService;
@GetMapping("/hello")
public User hello() {
User user = this.userService.queryById(8L);
return user;
}
}
我們啓動項目,查看: