(一)初识Spring
1.spring家族的主要成员
始于框架,但不止于框架,涉及到各行业
Spring Framework(用于构建企业级应用的轻量级一站式解决方案)
设计理念:
- 力争让选择无处不在
- 体现海纳百川的精神
- 保持向后兼容性
- 专注APi设计
- 追求严苛的代码质量
Spring Boot(快速构建基于spring的应用程序)
- 快、很快、非常快
- 进可开箱即用、退可按需改动
- 提供各种非功能特性
- 不用生成代码,没有XML配置
Spring Cloud(简化了分布式系统的开发)
- 配置管理
- 服务注册与发现
- 熔断
- 服务追踪
2.跟着spring了解技术趋势(spring boot、spring cloud)
3.编写第一个spring应用程序
actuator检测接口是否正常、是否是模板、查看容器创建的beans
(二)数据操作
1.JDBC必知必会
DataSourceAutoConfiguration 配置 DataSource
DataSourcreTransactiopnManagerAutoConfiguration 配置 DataSourceTransactionManager
JdbcTemplateAutoConfiguration 配置 JabdTemplate
数据源相关配置:
1.通用
- spring.datasource.url=jdbc:mysql://localhost/test
- spriing.datasource.usename=root
- spring.datasource.password=root
- spring.datasource.driver-class-name=com.mysql.jdbc.Driver(可选,spring boot根据数据库url进行选择合适驱动)
2.初始化内嵌数据库
- spring.datasource.initialization-mode=embeddeb | always | never
- spring.datasource.schema与spring.datasource.data确定初始化sql文件
- spring.datasource.platform=hsqldb | h2 | oracle | mysql | sql server
3.多数据源配置
4.好用的驱动数据源(可靠性、性能、功能、可运维性、可扩展性、其它【社区活跃、更新】)
spring boot 2.x默认使用HikaraCP
spring boot 1.x默认使用tomcat连接池,如果使用其它的连接池,需要移除tomcat-jdbc依赖
HikariCP
速度提升:
- 字节码级别优化(很多方法通过JavaAssist编译时生成)
- 用FastStatementList代替ArrayList
- 无锁集合ConcurrentBag(并发时性能更好)
- 代理类的优化(用invokestatic代替了invokevirtual)
常见的配置:(看源码DatasourceConfiguration.class)
- spring.datasource.hikara.maximumPoolSize=10(数据库连接池大小)
- spring.datasource.hikari.minimumldle=10.(idle连接个数)
- spring.datasource.hikari.idleTimeout=600000.(idle连接超时)
- spring.datasource.hikari.connectionTimeout=30000.(连接超时)
- spring.datasource.hikari.maxLifetime=1800000.(最大的生命时间)
Alibaba Druid(内置强大的监控功能,监控特性不影响性能;能防止sql注入,内置Logging能诊断Hack入侵应用行为;spring boot2.x需要在spring-jdbc包中排除HikariCP连接池)
使用功能:
- 详细的监控
- ExceptionnSorter,针对主流数据库的返回码都有支持
- SQL防注入
- 内置加密配置
- 众多扩展点,方便进行定制(可以实现连接前后增添一些业务逻辑[比如:继承FilterEventAdapter,重写连接前后方法])
配置:(依赖gruid-spring-boot-starter)
- spring.datasource.url=jdbc:mysql://localhost/test
- spriing.datasource.usename=root
- ###密码加密
- spring.datasource.password=加密密码
- spring.datasource.druid.filter.conifg.enabled=true
- spring.datasource.druid.connection-properties=config.decrypt=true;config.decrypt.key=${public-key}
- ###filter配置 全部使用默认配置
- spring.datasource.druid.filters=stat,config,slf4j,wall
- ###sql防注入
- spring.datasource.druid.filters.wall.enbled=true
- spring.datasource.druid.filters.wall.db-type=h2
- spring.datasource.druid.filters.wall.config.delete-allow=false
- spring.datasource.druid.filters.wall.config.drop=table-allow=-false
- spring.datasource.druid.initial-size=5(初始连接池大小)
- spring.datasource.druid.max-active=5(最大活跃数)
- spring.datasource.druid.min-idle=5(最小idle数)
- #慢SQL日志
- spring.datasource.druid.filter.stat.enables=true
- spring.datasource.druid.filter.stat.slog-slow-sql=true
- spring.datasource.druid.filter.stat.slow-sql-millis=3000
- spring.datasource.druid.test-on-borrow=true
- spring.datasource.druid.test-on-return=true
- spring.datasource.druid.test-shile-idle=true
5.Spring的JDBC操作类
包:spring-jdbs
- core,JdbcTemplate等相关核心接口和类
- datasource,数据源相关的辅助类
- object,将基本的JDBC操作封装成对象
- sipport,错误码等其它辅助工具
6.Spring的事务抽象
@EnableTransactionManagement 【开启事务管理】
一致的事务模型(JDBC / Hibernate/ myBatis)(DataSource / JTA)
事务抽象的核心接口PlatformTransactionManager(DataSourceTransactionManager 、 HibernateTransastionManager 、 JtaTransactionManager)===》commit方法、rollback方法
TransationDefinition(Propagation【传播特性】、Isolation(隔离级别)、Timeout(超时)、Read-only status(只读状态))
编程式事务:
TransactionTemplate(TransactionCallback、TransactionCallbackWithoutResult)
PlatformTransactionManager(可以传入TransactionDefinition进行定义)
声明式事务(使用AOP代理):
@EnableTransactionManagement(开启事务注解;proxyTargetClass指定代理类;mode;order事务执行顺序)
@Translational(transactionManager;propagation;isolation;timeout;readout;rollbackFor)
Spring的JDBC异常抽象(SQLErrorCodes.java各类数据库错误码进行对应的处理)
spring会将数据操作的异常转换为DataAccessException,无论使用何总数据访问方式,都能使用一样的异常
课程解疑
相关注解:
@Configuration(声明是配置类)
@ImportResource(引用额外的配置文件)
@ComponentScan(组建扫描)
@Bean(创建bean)
@configurationProperties
@Component、@Repository、@Service、@Controller、@RestController、@RequestMapping
@Autowired(根据类型注入)、@Qualifier(指定注入的bean过滤)、@Resource(根据名称进行注入)、@Value(获取配置信息、找到context上下文配置信息)
2.O/R Mapping实践
1、认识Spring Data JPA
Hibernate
- 一款开源的对象关系映射(Object / Relational Mapping)框架
- 将开发者从95%的常见数据持久化工作中解救出来
- 屏蔽了底层数据库的各种细节
JPA(java Persistence API):为对象关系映射提供了一种基于POJO的持久化模型
- 简化数据持久化代码的开发工作
- 为java社区屏蔽不同持久化api的差异
Spring Data(在保留底层存储特性的同时,提供相对一致的、基于Spring的编程模型)【Spring Data Commons ; Spring Data JDBC ; Spring Data JPA ; Spring Data Redis】
2、定义JPA的实体对象
注解
实体:@Entity、@mappedSuperclass【一般属于父类标记】、@Table(name="")【将实体和对应的表关联】
主键:@Id 、@GeneratedValue(strategy,generator)、@SequenceGenerator(name,sequenceName)
映射:@Column(name , nullable , length , insertable , updatable)、@JoinTable(name)、@JoinColumn(name)
关系:@OneToOne、@OneTomany、@ManyToOne、@ManyToMany、@OrderBy【排序】
Loombok常用注解:
@Getter / @Setter 、 @ToString、@NoArgsConstructor / @RequiredArgsConstryctor / @AllargsConstructor
@Data 、 @Builder【生成一个构造方法,进行构造对象】、@Slf4j / @CommonsLog / @Log4j2
3、线上咖啡馆实战项目:SpringBucks
4、通过Spring Data JPA操作数据库
@EnableJpaRepositories 【开启jpaResitories】
interface JpaResitory<T, ID>
interface PagingAndSortingRepository<T, ID>
interface CrudRepository<T, ID>
interface Repository<T, ID>
@NoRepositoryBean 【不需要给该类、接口创建bean】
Repository Bean是如何创建的?
接口中的方法是如何被解释的?
5、Mybatis(一款优秀的持久层框架;支持定制化SQL、存储过程和高级映射)
mybatis简单配置:
mybatis.mapper-locations=classpath*:mapper/**/*.xml
mybatis.type-aliases-package=类型别名的包名
mybatis.typs-handlers-package=TypeHander扫描报名
mybatis.configuration.map-underscore-to-camel-case=true 【下划线和驼峰命名对应】
@MapperScan 【配置扫描位置】
@Mapper 【定义接口】
@Param 【参数别名】
Mybatis Generator(Mybatis代码生成器;根据数据库表生成相关代码【POJO、Mapper接口、SQL Map XML】)
6、Mybatis PageHelper(支持多种数据;支持多种分页方式)
7、SpringBucks项目小结
3.NoSql实践
MongoDB(是一款开源的文档型数据库 https://www.mongodb.com)
Spring 对MongoDB的支持==》spring Data MongoDB(MongoTemplate【MongoDB增删改查】、Repository支持【类似于jpa 的repository】)
@Document、@Id、@EnableMongoRepositories
对应接口【MongoReposity<T, ID>、PagingAndSortingRepository<T, ID>、CrudRepository<T, ID>】
Redis(是一款开源的内存Key-valus存储,支持多种数据结构)
Spring对Redis的支持【Spring Data Redis(支持的客户端Jedis / Lettuce;RedisTemplate ; Repository支持)】
Jedis客户端注意点:
- Jedis不是线程安全(不能在多线程之间使用同一个Jedis客户端)
- 通过JedisPoll获得Jedis实例
- 直接使用Jedis中的方法
Redis的哨兵模式(是Redis的一种高可用方案==?监控、通知、自动故障转移、服务发现...)
JedisSentinelPoll(哨兵连接池)
Redis Cluster(Redis的集群模式==》数据自动分片[分成16384个hash slot];在部分节点失效时有一定可用性)
JedisCluster(Jedis只从Master读数据,如果想要自动读写分离,可以定制)
Spring的缓存抽象(为不同的缓存提供一层抽象)
- 为java方法增加缓存,缓存执行结果
- 支持ConcurrentMap、EhCache、Caffeine、JCache、RedisCache
- 接口(org.springframework.cache.Cache、org.springframework.cache.CacheManager)
@EnableCaching(开启缓存机制)
@Cacheable(如果有缓存则取,不存在可以取存取)
@CacheEvict(清除缓存)
@CachePut(存放缓存)
@Caching(缓存打包)
@CacheConfig(缓存设置)
Spring与Redis建立连接
LettuceConnectionFactory与JedisConnectionFactory
- RedisStandaloneConfiguration
- RedisSentinelConfiguration
- RedisClusterConfiguuration
Spring中Redis的读写分离
Lettuce内置支持读写分离
- 只读主,只读从
- 优先读主、优先读从
LettuceClientConfiguration
LettucePollingClientConfiguration
LettuceClientConfigurationBuilderCustomizer
Reids Repository
实体注解:@RedlisHash(类似于@Entity、@Document)、@Id、@indexed(二级索引)
Spring区分Repository方式:
- 根据实体类的注解
- 根据继承的接口类型
- 扫描不同的包
4.数据访问进阶
Project Reactor()
*******学习了一半学不下去了,不可否认作者是个技术大牛,但是讲课总带着各种英文专业术语,语速又快,如果有哪些方面没了解过的,很难听得懂,讲的技术又不是很深,一脸懵逼*******