概述
新特性
- 响应式编程
- 函数式编程
- HandlerFunction
- RouterFunction //TBD
-
核心概念
常用模块
核心容器
- spring -core
- spring-beans
- spring-context
- spring-context-support
- spring-expression
- AOP 与 Instrumentation
- spring-aop
- spring-aspects
- spring-instrument
- spring-instrument-tomcat
- 消息
- spring-messaging
- 数据访问/集成
- spring-jdbc
- spring-tx //事务
- spring-orm
- spring-oxm
- spring-jms
- Web
- spring-web
- spring-webmvc
- spring-websocket
- spring-webflux
测试
POJO模式 轻量级和最小侵入
- 依赖注入DI
- Decorator Proxy设计模式 进行声明式编程
- Template设计模式 消除样板代码
IoC容器
- 依赖注入与控制反转
- 控制反转一般分为依赖注入 和依赖查找 两种实现类型
- Ioc 容器和Bean
- 配置 元数据 //难点
- 基于注解
- 基于java
- 基于xml文件
- 实例化容器
- 使用容器
- bean的命名
- id
- name
- 实例化bean的方式
- 通过构造函数
- 通过静态工厂方法
- 使用工厂实例方法实例化 //可以在xml factory-method 设置
- 注入方式 ## 重点 ##
- 基于构造函数
- contructor-arg
- @ConstructorProperties 注解
- 基于setter方法
- 基于构造函数
- 依赖注入详细配置
- 直接赋值
- property标签
- p:xxxx
- properties
- 引用其他bean
- 内部bean
- 集合
- Null及空字符串
- XML 短命名空间
- 复合属性名称
- 直接赋值
- 使用depends-on 不是直接依赖关系时,强迫依赖的bean在引用前就会被初始化
- 延迟加载bean
- lazy-init 在引用时才会被初始化
- 自动装配
- 自动配置
- @ComponentScan + @Autowired 配合
- @SpringBootApplication = @Configuration+@EnableAutoConfiguration+@ComponentScan
- 自动配置
- 方法注入
- 单例bean A 使用非单例bean B时,每次A都是旧的,若想是新的方法有
- 使用getBean方法
- lookup-method注入
- 动态改变方法实现
- replaced-method
- 单例bean A 使用非单例bean B时,每次A都是旧的,若想是新的方法有
- bean scope
- singleton
- prototype //使用一次创建一次
- request //每个http都有自己的实例
- session //
- application //每个ServeletContext有一个实例
- websocket //每个websocket有一个实例
- 自定义scope
- 实现接口Scope
- 自定义bean生命周期
- 方式
- 通过实现 InitializingBean 和 DisposableBean //不推荐,因为有耦合
- JSR-250 注解如@PostConstruct 和 @PreDestory
- 使用init-method 和destory-method也可以解耦 spring接口
- 初始化回调
- 所有必要依赖配置完成后执行
- 实现 InitializingBean
- @PostConstruct
- 使用init-method 在xml中配置
- 销毁回调
- 结合生命周期机制
- 如果同时配置 ,执行顺序如下
- 包含@PostConstruct 注解的方法
- 在 InitializingBean 中的afterPoroertiesSet() 方法
- 自定义的init方法
- 销毁方法同时配置,执行顺序
- @PreDestroy注解的方法
- 在DisposableBean中的destory方法
- 自定义的destory方法
- 如果同时配置 ,执行顺序如下
- 启动和关闭回调
- 接口 Lifecycle
- LifeCycleProcesser
- SmartLifeCycle
- 在非web应用环境中优雅地关闭Spring Ioc容器
- Configurable ApplicationContext 的registerShutdowanHook来注册销毁钩子
- ApplicationContextAware和BeanNameAware
- ApplicationContextAware对象会包含一个ApplicationContext的引用
- 其他Aware接口
- 这些接口的使用都违反IoC原则,最好不用
- 方式
- bean定义继承
- 容器扩展点
- BeanPostProcesser
- 通过实现其定义的回调方法, 可以提供自己的实例化逻辑,依赖分析逻辑等
- 在Spirng容器完成实例化,配置和初始化bean后
- 可以配置多个,实现Ordered接口来控制顺序
- BeanFactoryPostProcessor
- 区别,操作bean的配置元数据,可以在容器实例化bean前修改他
- 也可以通过Ordered接口控制多个执行顺序
- BeanPostProcesser
- 容器扩展例子
- PropertyPlaceholderConfigurer
- BeanPostProcesser实现之一
- 用来允许部署应用程序来自定义指定环境属性, 如jdbc.properties
- PropertyOverrideConfigurer
- 有覆盖机制
- PropertyPlaceholderConfigurer
- 基于注解的配置
- @Required
- 修饰setter方法
- 如果属性没有被填充,那么容器就会抛异常,快速失败避免NullPointerException
- @Autowired
- 可以注解到传统的setter方法, @Inject也可以用于这种
- 也可以用于任意名称和多个参数的方法
- 也可以用于构造方法和字段
- 期望类型的数组
- 特定类型集合
- require=false
- @Primary
- 优先装配
- @Qualifier
- 通过参数来选择bean
- @Resource
- 默认byname
- @PostConstruct @PreDestory
- @Required
- 类路径扫描及组件管理
- @Component 及其同义注解
- @Repository @Service @Controller @Component 分别习惯用于持久层,服务层,表现层,和自定义
- @Repository 已经支持作为自动异常转换标记
- 元注解
- 能被应用到另一注解上的注解
- 也可以被用于创建组合注解
- 自动检测类并注册bean定义
- 需要添加@ComponentScan 到自己的 @Configuration类上
- 使用过滤器来自定义扫描
- @ComponentScan 添加include-filter exlude-filter参数
- @Component 及其同义注解
- JSR-330 规范注解
- 依赖注入标准规范
- @Inject 可代替@Autowired
- @Named @MangedBean
- 可代替@Compoent
- 基于Java的容器配置
- Java配置支持的核心是@Configuration 注解的类和@Bean 注解的方法
- AnnotaitonConfigApplicationContext
- 与Spring xml 配置作为输入实例化ClassPathXmlApplication的过程相似, @Configuration注解的类可以作为AnnotaitonConfigApplicationContext的输入,这样允许spirng容器中完全不使用xml
- 使用 register(Class<?>…) 编程式构造容器
- AnnotaitonConfigApplicationContext 可以用无参构造,再用register注册组件
- 使用scan 开启扫描组件
- AnnotaitonConfigApplicationContext的scan方法
- 指定bean的scope
- 自定义bean命名
- @Bean(name=”xx”)
- bean 描述
- @Import
- 允许从其他配置类中加载@Bean 的配置
- @ImportResource
- 使用xml配置
- 环境抽象
- Environment
- profile
- 包含了多个bean定义的一个逻辑集合,当指定profile被激活,其中的bean被激活
- @Profile
- 在@Configuration注解的类或其方法使用
- xml配置profile
- 激活profile
- ApplicationContext类的getEnviroment(). setActiveProfiles(“dev”)方法,支持多个,逗号分隔
- 可以通过spring.profiles.active中的属性,支持多个,逗号分隔
- 默认profile
- 没有其他被激活,那么默认profile会被激活
- properties
- @PropertySource(“”)
- 提供了一种简单的机制将PropertySource 增加到spring的Environment
- 参数中形如${..}的占位符 都可以被解析为Environment中的属性资源
- @PropertySource(“”)
- profile
- Environment
- 国际化
事件与监听器
- Spring标准事件
- ContextRefreshedEvent
- 当ApplicationContext被初始化或刷新时触发
- ContextClosedEvent
- ApplicationContext被关闭
- RequestHandleEvent
- http请求结束时
- ContextStartedEvent
- 容器调用start方法时触发
- ContextStopEvent
- 容器调用stop方法
- ContextRefreshedEvent
- 自定义事件
- Spring标准事件
概述
- Aspect
- 将关注点进行模块化,某些可能横跨多个对象
- @Aspect或基于模式的方法 来实现切面
- Join Point
- 在程序执行中某个特定的点, 如方法调用时或处理异常时
- Adivce
- 某个特定的连接点上执行的动作
- 包括 around before after 等通知
- spring 有 Before Advice, After Returning Advice,After Throwing Advice,After finally Advice ,Around Advice,
- Pointcut
- 匹配连接点的断言,
- 通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行
- Introduction
- TargetObject 被一个或多个切面所通知的对象
- AOP Proxy
- JDK动态代理
- CGLIB代理
- Weaving
- 把切面连接到其他应用程序类型或对象上,并创建一个Advised的对象
- 使用
- 使用@AspectJ
- @Pointcut
- @Before
- @AfterReturning
- 基于XML 的AOP
- 使用@AspectJ
- 理解代理机制
资源处理
- Aspect
资源接口
- Resource
- 内置资源接口实现
- UrlResource
- ClassPathResource
- FileSystemResource
- ServletContextResouce
- InputStreamResource
- ByteArrayResource
- ResourceLoader
- ResourceLoaderAware
Bean 验证
- Validator接口
表达式SpEL
- EpressionParser
- SpelEpxpression Parser
- 对于bean 定义的支持
- 常用表达式
- 文本表达式 单引号中
- 属性 数组 列表 Map 索引器
- 用点访问属性
- 方括号数组
- 内联列表 使用{}
- 内嵌Map { key:value}
- 数组构建
- 方法
- 运算符
- 类型 T
- 构造函数
- 变量 #
- 函数 registerFunction
- Bean 引用 @ &
- 三元运算符
- Evlis
- 安全导航运算符 避免空指针
- 集合选择 .?[xxxx]
- 集合投影 .![xxxx]
- 表达式模板
-
数据缓冲期和编解码器
数据缓冲器
- 引入是因为netty
- DataBufferFactory
- 有两种实现方式,一种为NettyDataBufferFactory 另一种为DefaultDataBufferFactory
- DataBuffer
- 类似ByteBuffer
- 也有两种实现方式
-
空安全
lang包
- @NonNull
- @Nullable
- @NonNullApi
- @NonNullFields
测试
微服务测试
mock与stub区别
主要支持以下功能
- 在测试执行之间管理Spring IoC 容器缓存
- 提供测试夹具实例的依赖注入
- 提供适合集成测试的事务管理
- 提供特定于spring的基类
- 上下文管理与缓存
- 加载上下文费时
- spring TestContext 提供了spring applicationContexts 和WebApplicationContexts的一致加载和这些上下文的缓存
- 测试夹具的依赖注入
- 事务管理
- 测试创建执行后,回滚事务
- @BootstrapWith
- 用于引导Spring TestContext 框架,用于指定一个自定义的TestContextBootstraper
- @ContextConfiguration
- 声明应用程序上下文资源位置,或将用于加载上下文的注解类
- @WebAppConfiguration
- 用于声明加载的ApplicationContext是一个WebApplicationContext
- @ContextHierarchy
- @ActiveProfiles
- @TestPropertySource
- @DirtiesContext
- @TestExecutionListeners
- @Commit
- @Rollback
- @BeforeTransaction
- @AfterTransaction
- @Sql
- @SqlConfig
- @SqlGroup
- 标准注解
- spring junit4 注解
- @IfProfileValue
- @ProfileValueSourceConfiguration
- @Timed
- @Repeat
- spring junit5 即Jupiter
- @SpringJunitConfig
- @SpringJunitWebConfig
- @EnableIf
- @DisableIf
-
Spring TestContext框架
核心抽象
- TestContext
- TestContextManager
- 是spring TestContext的主要入口
- 在定义良好的测试执行点向每个注册的TestExecutionListener 发信号通知事件
- 执行点
- 在特定测试框架的所有before class 或before all 方法之前
- 测试实例后处理
- 在特定测试框架所有before 或before each 方法之前
- 在测试方法执行之前,但在测试设置之后
- 在测试方法执行之后,但在测试关闭之前立即执行
- 在任何一个特定测试框架的每个after或after each 方法之后
- 在任何一个特定测试框架的每个after class或after class 方法之后
- TestExecutionListener
- 用于响应TestConextManager发布的测试执行事件
- ContextLoader
- 用来加载ApplicationContext
- SmartContextLoader
- 实现
- DelegatingSmartContextLoader
- WebDelegatingSmartContextLoader
- AnnotationConfigContextLoader
- AnnotationConfigWebContextLoader
- GenericGroovyXmlContextLoader
- GenericGroovyXmlWebContextLoader
- GenericXmlContextLoader
- GenericXmlWebContextLoader
- GenericProperttiesContextLoader
- 引导TestContext
- TestContextBootstrapper 定义了用于引导TestContext框架的SPI
- 建议不要直接实现此接口,而是扩展其已实现的类
- TestExcutionListener 配置
- 默认的实现类
- ServletTestExcutionListener
- DirtiestContextBeforeModesTestExecutionListener
- DependencyInjectionTestExectionListener
- DirtiesContextTestExecutionListener
- TransactionTestExecutionListenner
- SqlScriptsTestExecutionListenner
- 默认的实现类
- 上下文管理
- 每个TestContext 为他所负责的测试实例提供上下文管理和缓存支持
- 一个测试类实现ApplicationContextAware接口,那么可以访问ApplicationContext
- 可以用@Autowired来替代实现ApplicationContextAware
- 加载上下文
- @ContextConfiguration
- 测试夹具的依赖注入
- 如何测试request bean 和session bean
- xx
- 事务管理