SpringBoot
什么是微服务
微服务和以往有什么区别
为什么SpringBoot适合做微服务框架
SpringBoot或者微服务的不足
springBoot启动过程
springBoot如何进行自动装配和自定义配置
首先有几个注解 @configuration:声明一个配置类 @ConfigurationProperties:用于将xxx.yml配置文件中的对象与xxxproperties类进行对应,相当于@value逐一进行注入 @EnableConfigurationProperties:该注解用于自动配置属性,将配置类和xxxproperties进行对应 @ConditionalOnxxx:判断后接条件是否全部满足,满足则注入bean
- @EnableAutoConfiguration注解引入了一个自动配置导入搜索器(AutoConfigurationImportSelector)
这个搜索器会使用SpringFactoriesLoader加载器去扫描METE-INF/spring.factories路径下的文件
在METE-INF/spring.factories中存在许多的configuration配置类路径,这些配置类使用@EnableConfigurationProperties注解与xxxproperties配置文件类进行对应
xxxproperties配置文件类中使用@ConfigurationProperties注解将配置文件中的属性与注入到该类中
所以修改配置文件中的属性值即可实现自定义配置。
SpringBoot如何使得配置变得简单
springBoot的依赖在父工程中【spring-boot-dependencies】
版本号定义在spring-boot-dependencies中
springboot将部分功能场景变成一个个的启动器,使用时直接引入对应的启动器即可
springboot在启动是会加载大量的自动配置类
METE-INF/spring.factories
默认配置文件,如果在该文件中不配置的话需要进行手动配置
在springboot启动的时候不会全部加载,需要判断是否引入了对应的start启动器。
SpringBoot如何使得部署变得简单
- SpringBoot内置tomcat、jetty等web容器
- SpringBoot生成的jar包可以使用
java -jar直接执行 - SpringBoot提供Spring-boot-devtools用来实现热部署
@SpringBootApplication
- springboot的核心注解
@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三个注解的合集
@ComponentScan进行component扫描,将bean加载到容器中
@EnableAutoConfiguration允许自动配置,通过这个注解spring通过【AutoConfigurationImportSelector】把所需的bean注入到容器中。
@SpringBootConfiguration作用等同于@Configuration,用来声明当前类是一个配置类。通过@Bean将bean对象交给spring容器管理。
@ConditionalONXXX
表示如果该注解的条件都满足才会生效
springboot启动时@springbootApplication做了哪些操作
- 将所有依赖jar包导入到
- 声明启动类是一个component,将其交给spring容器管理
- 扫描所有的component,将其加载到容器中
SpringApplication类
- 推断是普通项目还是web项目【根据dispatchServlet,servletContainer】
- 加载所有初始化器
- 设置所有监听器
- 确定主类
springBoot配置文件
- 两种格式【yml或者properties】
- 名称固定【application.yml或application.properties】
- yaml可以存储对象,properties只能存储键值对
- 推荐yml
语法结构:
application.propertieskey=value----------application.ymlkey:空格value
application.yml
#存储对象student:name: hhage: 2student: {name: hh,age: 3}#数组/listname:- zhagn- wang- zhaoname: [zhang,wang,zhao]#mapmap: {k1: v1,k2: ${random.int}}
@ConfigurationProperties
可以使用该注解将yml配置文件中的对象进行注入 @ConfigurationProperties(prefix=”person”)
@PropertySource
@PropertySource(value = “classpath:test01.properties”) 用于加载指定配置文件【适用于properties格式】
@Vlidated
数据校验 @email(message=”不符合email格式”) private String email;
配置文件的优先级:
- 项目目录下的config文件夹
- 项目根目录
- 类路径【resource】下的config文件夹
- 类路径下
- 多环境配置 ``` properties格式 spring.profiles.active=dev
yml格式 多个版本可以同时写在同一个文件中 定义不同的名字,使用—-隔开 使用: spring: profiles: active: dev
<a name="e6576bc0"></a>#### yml配置文件是如何解析的> 在METE-INF/spring.factories中存在许多的configuration配置类路径,> 这些配置类使用@EnableConfigurationProperties注解与xxxproperties配置文件类进行对应> xxxproperties配置文件类中使用@ConfigurationProperties注解将配置文件中的属性与注入到该类中> 所以修改配置文件中的属性值即可实现自定义配置。<a name="Ck5Ne"></a>## Springboot注解1. SpringbootApplication<br />springboot项目的主类入口1. EnableAutoConfiguration<br />开启自动配置。加载自动配置类1. ComponentScan<br />进行组件扫描1. SpringbootConfiguration<br />作用和Configuration相同表明该类是一个配置类1. Import<br />导入一个类。1. ImportResource<br />用于在springboot中导入spring的配置。1. Configuration<br />指明当前类是一个配置类,用来代替之前的spring配置。使用了这个注解就可以不使用importResouce了1. enableAutoConfigurationImportSelector<br />读取META-INF/spring.factories中的自动配置类列表。1. ConfigurationProperties<br />从配置文件中读取配置与当前类进行绑定。`@configurationProerties(perfix = "spring.http.encoding")`1. EnableConfigurationProperties()<br />允许开启某个配置类的自动配置,需要与配置类(使用了ConfigurationProperties注解的类)进行绑定。1. Conditional<br />根据不同的条件进行判断,满足条件配置才会生效。1. ConditionalOnWebApplication<br />Conditional注解的扩展,要求该项目是一个web项目。1. value<br />用于注入配置文件中某个参数的值。1. validated<br />进行数据校验1. configurationproperties -> propertySource<br />configurationProperties注解读取application.properties配置文件中的数据,为了避免主配置文件过大,索引需要对配置文件进行分离,这时使用的propertySource可以读取单个properties配置文件。1. Bean<br />给容器中添加一个组件,标在方法上就是将返回值添加到容器1. Qualifier:<br />当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用;> Springmvc相关1. pathvariable<br />从url中提取参数。1. requestBody<br />表明参数从url从请求体中获取不是从url中获取。接受post请求。1. ResponseBody<br />将返回值直接返回页面,而不是通过视图解析器去寻找对应的页面。一般用于ajax请求,返回json。1. RestController<br />相当于@responseBody和Controller的合集,同样是直接返回。1. requestMapping<br />springmvc的注解,用于表明处理的请求路径<a name="m3qmP"></a>## 自动配置原理主要使用@EnableAoutConfiguration[@enableAutoConfigurationImportSelector]enableAutoConfigurationImportSelector将/META-INF/spring.factories下的EnableAutoConfiguration列表进行加载到容器中。EnableAutoConfiguration列表中包含了所有的自动配置类。一个自动配置类(如:httpEncodingAutoConfiguration类)中包含的注解1. ConfigurationProperties:表明该类是一个配置类1. EnableAutoConfigurationProperties:允许使用自动配置并绑定对应的配置类1. ConditionalOnWebApplication:判断当前是否为web应用1. ConditionalOnClass():判断当前项目是否存在某个类1. ConditionOnProperty:判断配置文件是否存在某个配置每一个自动配置类使用以下注解将其与配置文件进行绑定。所以在配置文件能够配置的属性都来自其properties.class类中定义的属性。httpEncodingAutoConfiguration类中定义了不同的方法,方法上定义了不同生效条件,当配置对应的方法生效时的,由于该方法使用@Bean进行标注,所以方法的返回值就会注入到spring容器中,所以能够达到配置文件自动注入的目的。> 自定义start同样自定义配置类(Starts),也是通过上面的方法。是对自动配置原理的反向应用。1. 有一个自定义配置类(PersonProperties.class)<br />该类中规定了person能够配置的属性。1. 一个自动配置类(PerSonAutoConfiguration.class)<br />将该类与Person配置类进行绑定1. 创建/METE-INF/spring.factories文件,按照其他AutoConfiguration类的规则,让后将项目打包1. 在pom.xml中引入自定义的Starter。1. 配置文件中能够配置的都是personProperties类中规定的属性。<a name="6af0193a"></a># 整合<a name="5af4b523"></a>## 整合数据库在yml配置文件中配置了datasource数据源之后可以使用datasource的bean对象连接数据库进行操作。- application.yml```ymlspring:datasource:username: rootpassword: rooturl: jdbc:mysql://127.0.0.1:3306/gl_itgs?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSourcefilters: wall,ltog4j,stat
testControllet
@RestControllerpublic class testController {@AutowiredDataSource dataSource;//自动注入jdbctmeplate即可@AutowiredJdbcTemplate jdbcTemplate;@GetMapping("/findAll/{dmlb}")public List<Map<String, Object>> getData(@PathVariable String dmlb) throws SQLException {String sql = "select * from gl_sys_code where dmlb =" +dmlb +" limit 10";List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);return list;}}
xxxtemplate
spring已经配置好的bean,拿来即用,如jdbctemplate
整合DRUID
DRUID 是阿里巴巴平台上一个数据库连接池实现 结合了DBCP,C3P0等数据库连接池的有点,同时加入了日志监控
详情连接https://www.bilibili.com/video/av75233634?p=32
整合mybatis
整合springSecurity
主要功能:认证,授权
整合swagger
API框架
作用:REST API 文档在线自动生成工具
直接运行,可以在线测试API接口
支持多种语言
使用
- 导入jar包、
swagger2,UI ```xmlio.springfox springfox-swagger2 2.9.2
- 配置swaggerConfiguration```java//自定义swagger配置@Configuration@EnableSwagger2public class SwaggerConfig {}
自定扫描包
Docket的select方法自定义扫描包,是否可用等。@Configuration@EnableSwagger2public class SwaggerConfig {@Beanpublic Docket docket(Environment environment) {//根据项目运行环境设置是否可用boolean flag = true;Profiles profiles = Profiles.of("dev");flag = environment.acceptsProfiles(profiles);return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(flag).select()//指定要扫描的包.apis(RequestHandlerSelectors.basePackage("com.example.demo.controller")).build();}private ApiInfo apiInfo() {Contact DEFAULT_CONTACT = new Contact("", "", "");return new ApiInfo("Api Documentation","Api Documentation","1.0","urn:tos",DEFAULT_CONTACT,"Apache 2.0","http://www.apache.org/licenses/LICENSE-2.0",new ArrayList());}}
设置多个分组
生成多个docketBean对象,设置不同的分组名称```java@Beanpublic Docket docket1(Environment environmen) {return new Docket(DocumentationType.SWAGGER_2).groupName("A");}@Beanpublic Docket docket1(Environment environmen) {return new Docket(DocumentationType.SWAGGER_2).groupName("B");}
- 注释操作 ```java @ApiOperation(“获取用户”) @Api(tags = “controller”) @ApiParam(“用户id”)
@ApiModel(“用户类”) public class User { @ApiModelProperty(“用户名”) private String name; @ApiModelProperty(“密码”) private String password;
}
@Api(tags = “controller”) @RestController public class testController { @Autowired DataSource dataSource;
@AutowiredJdbcTemplate jdbcTemplate;@GetMapping("/findAll/{dmlb}")public List<Map<String, Object>> getData(@PathVariable String dmlb) throws SQLException {String sql = "select * from gl_sys_code where dmlb =" +dmlb +" limit 10";List<Map<String, Object>> list = jdbcTemplate.queryForList(sql);return list;}@ApiOperation("获取用户")@RequestMapping(value = "/user/{id}",method = RequestMethod.GET)public String getUser(@ApiParam("用户id") @PathVariable String id){return id + "";}
}
<a name="99333a08"></a>## springBoot 与docker<a name="Docker"></a>### Docker<a name="e2d6d0e3"></a>#### 基本概念1. 镜像(images)> 用于创建docker的模板2. 容器> 镜像启动后的实例称为一个容器,是独立运行的一个或一组应用3. 客户端> 连接docker主机进行操作4. 主机> 安装了Docker程序的机器5. 仓库> 用来保存各种打包好的镜像【dockhub】<a name="67d92f75"></a>#### 与虚拟机的不同<a name="867ac76e"></a>#### 使用步骤1. 安装docker2. 去仓库找到对应的镜像3. 使用docker运行这个镜像,生成一个docker容器4. 对容器的启动停止就是对软件的启动停止。<a name="e655a410"></a>#### 安装
- sudo apt-get update
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ gnupg-agent \ software-properties-common
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- sudo apt-key fingerprint 0EBFCD88
- sudo add-apt-repository \ “deb [arch=amd64] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) \ stable”
- sudo apt-get update
- 安装最新版:sudo apt-get install docker-ce docker-ce-cli containerd.io
- 安装指定版本:
获取可用版本信息: apt-cache madison docker-ce
安装: sudo apt-get install docker-ce=
docker-ce-cli= containerd.io - 验证:docker —version 或: docker —version ```
使用
检索
docker search mysql
拉取
docker pull mysql docker pull mysql:5.5
列表
docker images
删除镜像
docker rmi
启动容器
docker run —name -d : docker run —name mytomcat -d tomcat:8.5-jdk11-openjdk
重启容器
docker restart /
查看运行的容器
docker ps
查看所有容器
docker ps -a
容器重命名
docker rename
停止运行的容器
docker stop
删除容器
dock rm
端口映射
docker run -d -p 主机端口号:映射端口号 镜像名 docker run -d -p 8888:8080 tomcat -d : 后台运行 -p : 端口映射
容器日志
docker log /:
进入容器目录
docker exec -it /bin/bash docker docker exec -it 968996d73e77 /bin/bash
实例
使用MySQL
//开启mysqldocker run -p 3307:3306 --name mysql01 -e MYSQL_ROOT_PASSWORD=000000 -d mysql:5.5run : 执行-p:端口映射--name: 自定义容器名-e MYSQL_ROOT_PASSWORD:设置MySQLROOT用户密码-d:后台执行
