文章目录
1. 前言
在看这篇文章之前呢,我希望大伙应该了解SpringBoot的自动装配的原理,如果这个不清楚的话,这篇文章或许看起来就有些困难了。
这个SpringBoot的自动装配原理其实很简单,没有什么特别难理解的地方。来回那么回事儿,想想也知道。比如:之前在用spring 的时候,集成一个别的技术,需要配置这个,配置那个的。比如你在这个项目A中要使用Mybatis,所以你需要把其整合到Spring中来,需要“这么”配置,那么在这个项目B中也要集成Mybatis,你的配置是否与项目A中的配置类似(或许只是参数不同)?是不是这些个配置出现重复了?那么SpringBoot的自动装配原理就来了,那么既然基本的配置都这么配置 那干脆我直接给你提供这个配置得了,你直接给我配置里面需要的参数即可了(在application.yml 中配置的就是参数了)。那么在SpringBoot启动的时候,就会去扫描这些个自动配置的类,如果其符合要求,就给他加到spring的容器中使其生效。然后就用起来非常的爽,就给几个参数,就可以整合一个技术。
需要的可以看一下我的SpringBoot自动装配原理的文章: 点击跳转
2. 什么是starter?
那么话说回来,啥是starter 呢?比如我们SpringBoot 需要 web 的话 需要的坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
整合Mybatis 的话,需要的坐标:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
整合Jpa 的话,需要的坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
上面的就是starter,或许也就是看着名字像,那他的具体作用是什么呢?还是没有体现出来。
2.1 下面以SpringDataJpa举例
如果直接使用Spring 整合SpringDataJpa的话,需要如下坐标:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<!-- hibernate beg -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.2.1.Final</version>
</dependency>
<!-- hibernate end -->
.....................
.....................
.....................
然后在做spring Data Jpa 的配置:
<!--配置entityManagerFactory-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<!--配置要扫描的包(entity的包)-->
<property name="packagesToScan" value="com.lzy.pojo"/>
<!--配置jpa实现的厂家-->
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider"/>
</property>
<!--jpa供应商的适配器-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="database" value="MYSQL"/>
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
<!--配置是否 自动创建数据库表-->
<property name="generateDdl" value="false"/>
<property name="showSql" value="true"/>
</bean>
</property>
<!-- 注入jpa原生的配置 -->
<property name="jpaProperties">
<props>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<!--sping 整合jpa-->
<jpa:repositories
base-package="com.lzy.dao"
transaction-manager-ref="transactionManager"
entity-manager-factory-ref="entityManagerFactory">
</jpa:repositories>
如果SpringBoot 的话引入坐标的话:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
application.yml中配置:
spring:
application:
name: boot-research
jpa:
database: mysql
show-sql: true
generate-ddl: false
hibernate:
ddl-auto: update
naming:
physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl
database-platform: org.hibernate.dialect.MySQLDialect
发现没有,SpringBoot 默认的情况下 我们根本就没有写配置文件。
2.2 说明的问题
从2.1 可以看出, SpringBoot 中Starter的作用:
- 依赖jar包
- 提供默认的配置
从2.1 的例子就能看出来, Spring 中整合jpa 是不是写了一堆坐标?而在SpringBoot 中就依赖了一个jpa starter 。那么结果显然是starter 中已经依赖了jpa需要的坐标,我们只需要依赖jpa的starter ,那些特别难记的坐标,就自动引入了。
还有就是,我们在依赖的starter 之后,并没有写配置文件,那么显然在starter中也是提供了默认的配置类,我们只需要配置参数即可。(需要说明的是:jpa的配置类并不是jpa的starter提供的。其他的非spring的技术在写自己的starter的时候,是需要自己提供的,因为spring 肯定没有提供。)
3. 定义自己的 starter
从上面的阐述我们知道了starter 是什么,下面我以自定义Swagger2的starter 为例来定义自己的starter。
3.1 正常的swagger2的整合
3.1.1 pom
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
</dependency>
3.1.2 config
@Configuration
@EnableSwagger2
public class SwaggerConfig {
@Bean
public Docket webApiConfig(){
return new Docket(DocumentationType.SWAGGER_2)
.groupName("groupNamexxx")
.apiInfo(webApiInfo())
.select()
.paths(PathSelectors.any())
.build();
}
private ApiInfo webApiInfo(){
return new ApiInfoBuilder()
.title("xxx")
.description("xxxx")
.version("1.0")
.contact(new Contact("Immort", "http://www.xxx.com", "[email protected]"))
.build();
}
}
3.1.3 使用
直接打注解使用即可
3.2 自定义starter
3.2.1 创建项目
3.2.2 pom
3.2.3 config
定义porperties类用来存储yml中的配置
定义默认配置类(其中几个注解的作用可以看我上篇文章,或者查阅相关资料):
定义spring.factories
文件(至于为什么,请看我上篇文章,或者查阅相关资料)
additional-spring-configuration-metadata.json文件的编写,这个文件可写可不写,如果写了的话,在我们在填写application.yml 的时候会有相应的提示,至于该文件的书写规范请:点击跳转
3.2.4 打包
使用maven 打包即可,如果你使用gradle 也是一样的。
3.3 自定义starter 的使用
3.3.1 随便找个其他的项目
3.3.2 引入我们自定义的starter
3.3.3 application.yml 中配置
3.3.4 使用-好好滴
4. 总结
没有什么好说的。