SpringBoot整合SpringMVC

雖然默認配置已經可以使用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 type WebMvcConfigurer but without @EnableWebMvc. If you wish to provide custom instances of RequestMappingHandlerMapping, RequestMappingHandlerAdapter, or ExceptionHandlerExceptionResolver, you can declare a WebMvcRegistrationsAdapter 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註解。如果你想要自定義HandlerMappingHandlerAdapterExceptionResolver等組件,你可以創建一個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;
    }
}

我們啓動項目,查看:

在這裏插入圖片描述

發佈了48 篇原創文章 · 獲贊 11 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章