(一)初識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()
*******學習了一半學不下去了,不可否認作者是個技術大牛,但是講課總帶着各種英文專業術語,語速又快,如果有哪些方面沒了解過的,很難聽得懂,講的技術又不是很深,一臉懵逼*******