MyBatis笔记二:配置
1.全局配置
1.properites
这个配置主要是引入我们的 properites 配置文件的:
1 | <properties resource="db.properties"/> |
可以看到我们使用 <properties resource="db.properties"/>
引入了我们的数据据库的配置文件,然后这个标签有两个属性 : resource
和 uri
第一种直接是引用项目下的文件。第二个就是引用网络路径的和我们本地文件系统的资源。
这个配置主要是引入我们的 properites 配置文件的:
1 | <properties resource="db.properties"/> |
可以看到我们使用 <properties resource="db.properties"/>
引入了我们的数据据库的配置文件,然后这个标签有两个属性 : resource
和 uri
第一种直接是引用项目下的文件。第二个就是引用网络路径的和我们本地文件系统的资源。
SpringCloud 是微服务架构的一个实现框架,说他是一个框架更不如说他是一个生态,他包含了很多个技术,将这些技术组合起来形成我们的微服务架构应用。
最大区别:SpringCloud抛弃了Dubbo的RPC通信,采用的是基于HTTP的REST方式。
严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生RPC带来的问题。而且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更加合适。
很明显,Spring Cloud的功能比DUBBO更加强大,涵盖面更广,而且作为Spring的拳头项目,它也能够与Spring Framework、Spring Boot、Spring Data、Spring Batch等其他Spring项目完美融合,这些对于微服务而言是至关重要的。使用Dubbo构建的微服务架构就像组装电脑,各环节我们的选择自由度很高,但是最终结果很有可能因为一条内存质量不行就点不亮了,总是让人不怎么放心,但是如果你是一名高手,那这些都不是问题;而Spring Cloud就像品牌机,在Spring Source的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。
我们准备了四个模块,然后这四个模块分别就是用来做统一项目管理的 parent
、一个公共的 api
比如通用的实体类 、一个服务提供者和一个服务消费者。
这样我们形成了一个简单的微服务架构的程序了,接下来就是一步一步的搭建这个框架,这里采用的是 Idea 来搭建项目。
首先我们创建一个Maven项目,注意一点的就是再生成这个项目的时候我们的打包方式要选择 pom 而不是 jar 或者 war,然后这个项目会自动生成一堆的文件夹,其实我们只需要这个 pom 文件,因为只需要做版本控制,而不用写代码的地方。那么我们就删除那些 java 、test 文件夹。
那么现在我们的 parent 工程就创建好了,接着就是做一些版本依赖的处理了,我们就需要在pom文件中添加如下的内容。
1 |
|
注意一点的就是因为我这个pom文件是所有工程都创建好的工程的 pom 所以说这里我的 子模块 是后来加上去的,可以直接删了后面真的在创建子模块的时候会自动生成这些东西。
接着我们在我们创建好的 parent 工程上 右键创建一个新的 module
然后我们项目结构还是选择 Maven
注意一点的就是我们在创建项目的时候可以选择父工程,我们在这里就选择我们创建好的 parent 工程。
那么生成好的项目就会有这么一段文字:
1 | <parent> |
然后我们在里面加一些我们常用的依赖以后,我们的pom就会长成这个样子:
1 |
|
好的,现在我们的基础配置已经配置好了,就可以在 api 中写代码了。我们这里需要共享的 api 其实就是我们的实体类,实际上还有很多,这里我们就仅仅拿实体类做例子。
创建一个 entries 包 然后创建一个实体类:
1 | package entries; |
由于我们上面添加了 小辣椒
的依赖,这里的实体类非常简单。
这步完成了就应该是这样的一个结构,然后我们就可以开始生产者的创建了。
生产者里面其实我们应该包含一个完整的 web 层,也就是说我们需要有完整的 Controller 、Service、Dao 然后我们的Controller是用来给后面的消费者调用的,因为我们的SpringCloud是基于Rest请求的嘛。
同理我们创建一个Maven项目,然后导入父工程,接着就是导入依赖:
1 |
|
1 | server: |
1 | package lwen.dao; |
1 | package lwen.service; |
1 | package com.lwen.controller; |
同上创建一个module,完成消费者的编写。
消费者其实只有一个Controller,这是因为我们的真正的业务逻辑都被封装到我们的微服务中去了,所以说不存在后面的Service以及Dao。
1 |
|
1 | server: |
1 | package com.lwen.config; |
这个地方我使用了 JavaConfig 配置了一个 RestTemplate 的Bean,然后这个东西其实就是和我们以前接触的 redisTemplate 以及 jdbc的一样,就是一个工具,用来简化操作的。这里就是简化我们的 rest 请求操作,相当于一个 Http 的客户端。
1 | package com.lwen.controller; |
好,现在我们的项目搭建完毕,目前的目录架构应该是这样的:
微服务其实就是我们的以前的整个应用拆分的一个个小的应用服务,也就是我们的一个个模块。每一个微服务就是一个进程,运行在一个独立的进程之上,然后通过网络进行通讯互联。
微服务架构是一种架构模式,他是把传统的单体应用(All in one),拆分成多个项目独立的微服务,然后每一个为服务都是一个独立进程,拥有自己的独立的数据库。然后各个微服务的整合形成整个的微服务架构。
微服务条目 | 技术 |
---|---|
服务开发 | Springboot、Spring、SpringMVC |
服务配置与管理 | Netflix公司的Archaius、阿里的Diamond等 |
服务注册与发现 | Eureka、Consul、Zookeeper等 |
服务调用 | Rest、RPC、gRPC |
服务熔断器 | Hystrix、Envoy等 |
负载均衡 | Ribbon、Nginx等 |
服务接口调用(客户端调用服务的简化工具) | Feign等 |
消息队列 | Kafka、RabbitMQ、ActiveMQ等 |
服务配置中心管理 | SpringCloudConfig、Che等 |
服务路由(API网关) | Zuul |
服务监控 | Zabbix、Nagios、Metrics、Spectator等 |
全链路追踪 | Zipkin,Brave、Dapper等 |
服务部署 | Docker、OpenStack、Kubernetes等 |
数据流操作开发包 | SpringCloud Stream(封装与Redis,Rabbit、Kafka等发送接收消息) |
事件消息总线 | Spring Cloud Bus |
这里我们的SpringCloud就是一个微服务架构的框架的具体实现了。同样的还有很多其他的微服务架构,比如现在非常出名的Dubbo 以及京东的 JSF 新浪的 Motai
几个重要的事件回调机制
配置在META-INF/spring.factories
ApplicationContextInitializer
SpringApplicationRunListener
只需要放在ioc容器中
ApplicationRunner
CommandLineRunner
先 new 了这个对象,然后调用了他的 run 方法。
调用了initialize(sources)
1 | private void initialize(Object[] sources) { |
1 | public ConfigurableApplicationContext run(String... args) { |
配置在META-INF/spring.factories
ApplicationContextInitializer
1 | public class HelloApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> { |
SpringApplicationRunListener
1 | public class HelloSpringApplicationRunListener implements SpringApplicationRunListener { |
配置(META-INF/spring.factories)
1 | \ = |
只需要放在ioc容器中
ApplicationRunner
1 |
|
CommandLineRunner
1 |
|
starter:
1 | //指定这个类是一个配置类 |
启动器只用来做依赖导入;专门来写一个自动配置模块;
启动器依赖自动配置;别人只需要引入启动器(starter)
mybatis-spring-boot-starter;自定义启动器名-spring-boot-starter
步骤:
1)、启动器模块
1 |
|
2)、自动配置模块
1 |
|
1 | package com.atguigu.starter; |
1 | package com.atguigu.starter; |
1 | package com.atguigu.starter; |
https://github.com/spring-projects/spring-boot/tree/master/spring-boot-samples
1 | <dependency> |
1 | spring: |
1. 用org.apache.tomcat.jdbc.pool.DataSource作为数据源;
2. 数据源的相关配置都在DataSourceProperties里面;
org.springframework.boot.autoconfigure.jdbc包下就是进行自动配置的包:
参考 DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池,可以使用spring.datasource.type指定自定义的数据源类型
SpringBoot默认可以支持:org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource
1 | /** |
一个监听器,主要用于sql脚本的运行
作用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
默认只需要将文件命名为: schema-*.sql 或者 data-*.sql
默认规则:schema.sql,schema-all.sql
当然我们也可以在配置文件中指定,然后就加载指定的sql 脚本,这里是一个 list 也就是脚本可以指定多个。
1 | schema: |
1 | 5 : |
上面的配置文件中的数据实际上我们没用上,这里我们需要创建一个 DruidConfig 然后和当前的配置文件绑定。
1 |
|
1 | <dependency> |
1 | //指定这是一个操作数据库的mapper |
自定义MyBatis的配置规则,给容器中添加一个ConfigurationCustomizer;
1 | .springframework.context.annotation.Configuration |
使用MapperScan批量扫描所有的Mapper接口,这样的话我们就不用在Mapper接口上写 @Mapper 注解了。就属于批量的注解了这些注解。
1 |
|
1 | mybatis: |
更多使用参照 http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
JPA:ORM(Object Relational Mapping);
1)、编写一个实体类(bean)和数据表进行映射,并且配置好映射关系;
1 | //使用JPA注解配置映射关系 |
2)、编写一个Dao接口来操作实体类对应的数据表(Repository)
1 | //继承JpaRepository来完成对数据库的操作 |
3)、基本的配置JpaProperties
1 | spring: |
1 | <dependency> |
1 | spring: |
1. 用org.apache.tomcat.jdbc.pool.DataSource作为数据源;
2. 数据源的相关配置都在DataSourceProperties里面;
org.springframework.boot.autoconfigure.jdbc包下就是进行自动配置的包:
参考 DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池,可以使用spring.datasource.type指定自定义的数据源类型
SpringBoot默认可以支持:org.apache.tomcat.jdbc.pool.DataSource、HikariDataSource、BasicDataSource
1 | /** |
一个监听器,主要用于sql脚本的运行
作用:
1)、runSchemaScripts();运行建表语句;
2)、runDataScripts();运行插入数据的sql语句;
默认只需要将文件命名为: schema-*.sql 或者 data-*.sql
默认规则:schema.sql,schema-all.sql
当然我们也可以在配置文件中指定,然后就加载指定的sql 脚本,这里是一个 list 也就是脚本可以指定多个。
1 | schema: |
1 | 5 : |
上面的配置文件中的数据实际上我们没用上,这里我们需要创建一个 DruidConfig 然后和当前的配置文件绑定。
1 |
|
1 | <dependency> |
1 | //指定这是一个操作数据库的mapper |
自定义MyBatis的配置规则,给容器中添加一个ConfigurationCustomizer;
1 | .springframework.context.annotation.Configuration |
使用MapperScan批量扫描所有的Mapper接口,这样的话我们就不用在Mapper接口上写 @Mapper 注解了。就属于批量的注解了这些注解。
1 |
|
1 | mybatis: |
更多使用参照 http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/
JPA:ORM(Object Relational Mapping);
1)、编写一个实体类(bean)和数据表进行映射,并且配置好映射关系;
1 | //使用JPA注解配置映射关系 |
2)、编写一个Dao接口来操作实体类对应的数据表(Repository)
1 | //继承JpaRepository来完成对数据库的操作 |
3)、基本的配置JpaProperties
1 | spring: |