Spring Boot 是由Spring框架团队推出的一款用来简化Spring应用程序创建和开发过程的框架,它基于Spring框架,使用约定优于配置,大大简化了Spring应用程序的配置和开发过程。在很多企业中,Spring Boot 已经被广泛应用,成为了构建微服务的首选框架之一。
Spring Boot 入门的教程已经有很多了,本篇文章将讲解一些 Spring Boot 进阶的话题,旨在帮助读者更好的理解 Spring Boot 的高级特性,并能在实际项目中更好地运用。
一、Spring Boot自定义Starter
Spring Boot 自定义 Starter 可以让我们将一些特定场景中常用的配置、依赖和代码封装起来,使得在这种场景下启动一个新的应用程序变得非常容易。Spring Boot 提供了对自定义 Starter 的支持,下面我们来看一个简单的例子。
首先,我们需要创建一个 Maven 项目,名为 my-spring-boot-starter。在 pom.xml 中添加以下依赖:
<dependencies><!-- Spring Boot 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>${spring.boot.version}</version></dependency>
</dependencies>
接下来,创建一个自定义的 Starter 类。这个 Starter 类只需要继承 org.springframework.boot.autoconfigure.EnableAutoConfiguration
类即可:
@EnableAutoConfiguration
public class MySpringBootStarter {
}
这个 Starter 类只是一个空类,不过它的存在可以让 Spring Boot 自动扫描到这个类,并且会自动进行一些配置,比如自动注入一些 Bean 等等。在本例中,由于我们没有做任何配置,所以没什么用处。
我们先把这个 Starter 发布到本地仓库,然后就可以在其他项目中使用了。下面我们在一个新的 Spring Boot 项目中使用我们的 Starter:
在 pom.xml 中添加依赖:
<dependency><groupId>com.example</groupId><artifactId>my-spring-boot-starter</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>
然后在 Application 类上添加注解:
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
这样,我们就完成了一个最简单的 Spring Boot 自定义 Starter。当然,实际的 Starter 中还可以包含一些配置类、Bean、拦截器等等,以满足不同场景的需求。
二、Spring Boot自动装配
Spring Boot 自动装配是通过扫描 classpath 中的 jar 包来实现的。当 Spring Boot 从 classpath 中发现一个 jar 包时,它会尝试自动配置这个 jar 包中的 Bean,这样就可以极大地简化配置。
在很多情况下,我们都用不到所有的自动配置。比如,如果我们使用 Spring Boot 的 WebMVC 功能,那么 Spring Boot 会自动配置 Tomcat 的嵌入式 Servlet 容器,这样就可以让我们快速地启动一个嵌入式的 Web 服务。但是,如果我们不需要 Tomcat 容器,而是想使用 Jetty 容器,这时候我们就可以通过禁用 Spring Boot 的 Tomcat 自动配置,然后自己手动配置 Jetty。
下面我们来看一个例子,在 Spring Boot 中禁用 Tomcat 自动配置,然后手动配置 Jetty。
首先,在 pom.xml 中移除 Tomcat 的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions>
</dependency>
然后添加 Jetty 的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
接下来,创建一个 Jetty 配置类:
@Configuration
public class JettyConfig {@Beanpublic Server server() {return new Server();}@Beanpublic JettyEmbeddedServletContainerFactory jettyEmbeddedServletContainerFactory(Server server) {JettyEmbeddedServletContainerFactory factory = new JettyEmbeddedServletContainerFactory();factory.setServer(server);return factory;}
}
在这个配置类中,我们创建了一个 Jetty 的 Server 实例,并将其注入到 JettyEmbeddedServletContainerFactory 中。这样,当我们启动 Spring Boot 应用程序时,它将使用我们自己创建的 Jetty 容器而不是默认的 Tomcat 容器。
三、Spring Boot集成MyBatis
MyBatis 是一款优秀的 ORM 框架,它可以非常方便地使用 SQL 语句操作数据库。在实际项目中,我们经常使用 MyBatis 来访问数据库。下面我们来看一下如何在 Spring Boot 中集成 MyBatis。
首先,我们需要在 pom.xml 中添加 MyBatis 和 MySQL 的依赖:
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.boot.version}</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version>
</dependency>
接下来,我们需要配置数据源,让 MyBatis 和 MySQL 进行连接。在 Spring Boot 中,可以使用 application.properties 或 application.yml 进行配置。以下是一个使用 application.properties 配置数据源的例子:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root
在这里,我们指定了 MySQL 的 JDBC 驱动、连接 URL、用户名和密码。
然后,我们需要创建一个 MyBatis 的配置文件 \src\main\resources\mybatis\mybatis-config.xml。这个配置文件中包含了 MyBatis 的一些基本配置。以下是一个简单的示例配置:
<configuration><settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="aggressiveLazyLoading" value="false"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="mapUnderscoreToCamelCase" value="true"/></settings>
</configuration>
在这个配置文件中,我们设置了一些 MyBatis 的默认配置选项,比如启用缓存、启用懒加载、使用驼峰命名法等等。
接下来,我们需要编写 Mapper 接口和对应的 SQL 映射文件。Mapper 接口用于定义对数据库的操作,而 SQL 映射文件用于描述具体的 SQL 语句,以及参数、返回类型等。以下是一个 Mapper 接口和对应的 SQL 映射文件的例子:
@Mapper
public interface UserMapper {@Select("select * from user where id=#{id}")User getUserById(int id);@Insert("insert into user(id,name,age) values(#{id},#{name},#{age})")int addUser(User user);
}
Mapper中如果定义了SQL,那么就不需要定义Mapper.xml,Mapper.xml如下:
<mapper namespace="com.example.demo.dao.UserMapper"><resultMap id="UserMap" type="com.example.demo.entity.User"><id column="id" property="id" javaType="int"/><result column="name" property="name" javaType="String"/><result column="age" property="age" javaType="int"/><resultMap/>
至此,SpringBoot开发的流程就结束了,下期再见!