SSM
2025-09-22 22:03:14 0 举报
AI智能生成
有关SSM框架的知识点归纳
作者其他创作
大纲/内容
SpringMVC框架
SpringMVC(功能等同于Serverlet)
约定
遵循MVC模式(Model-View-Controller),将业务逻辑、数据渲染和请求分发分离,使代码结构清晰,易于维护。
RESRFull风格
资源导向 (Resources)
动作
get
post
put
delete
统一接口 (Uniform Interface)
无状态 (Stateless)
使用标准的状态码 (Status Codes)
返回统一的资源表述 (Representation)
json
返回值 Result风格
Result
data
返回数据
code
运行状态
msg
返回给用户的信息
请求调度
请求接收:DispatcherServlet 接收所有 HTTP 请求
处理器映射:HandlerMapping 根据 URL 找到对应的 Controller 和方法
处理器适配:HandlerAdapter 执行目标处理方法
拦截器处理:执行预处理和后处理逻辑
前后端不分离
视图解析:ViewResolver 解析视图名称
视图渲染:View 渲染模型数据并返回响应
核心组件
前端控制器 (DispatcherServlet):统一接收所有请求,并协调各组件协同工作
处理器映射 (HandlerMapping):将请求映射到具体的处理器(Controller)
视图解析器 (ViewResolver):解析逻辑视图名为具体视图实现
控制器 (Controller):处理请求的业务逻辑
模型 (Model):封装应用程序数据
参数/返回值处理
策略
视图名称:返回字符串表示逻辑视图名
@ResponseBody:将方法返回值直接写入响应体
ResponseEntity:允许完全控制响应头、状态码和正文
模型和视图:返回 ModelAndView 对象包含模型数据和视图信息
@ResponseBody:将方法返回值直接写入响应体
ResponseEntity:允许完全控制响应头、状态码和正文
模型和视图:返回 ModelAndView 对象包含模型数据和视图信息
参数/返回值绑定
参数
@RequestParam:绑定查询参数
@PathVariable:绑定 URL 路径变量
@RequestBody:绑定请求体内容(JSON/XML)
@ModelAttribute:绑定表单数据到模型对象
@RequestHeader:绑定请求头信息
@CookieValue:绑定 Cookie 值
返回值
@ResponseBody
拦截器与过滤器
拦截器Filter(Servlet技术)
对所有访问进行增强
自定义过滤器,1.实现Filter接口(SpringBoot 3开始jakarta.servlet.Filter)2.重写doFilter,实现过滤逻辑,酌情放行 3. 创建注解,实现过滤的范围配置
过滤器Interceptor(SpringMVC技术)
仅针对SpringMVC的访问进行增强
继承HandlerInterceptor(放在Controller.interceptor下使用)
preHandle
postHandle
afterCompletion
创建SpringMvcSupport
继承WebMvcConfigurer
addResourceHandlers
增加静态资源和管理路径
addInterceptors
增加过滤器和管理路径
1自定义拦截器,实现HandlerInterceptor接口 2. 实现接口中的拦截方法(preHandle-请求执行前、postHandler-请求执行后、afterCompletion-视图渲染后) 3. 创建配置类,实现webMvcConfigurer接口,重写addInterceptors方法
list传参需要使用@RequestParam或者@RequestBody注解
1 Filter依赖于Servlet容器,属于Servlet规范的一部分,而Interceptor依赖于SpringMVc框架;2.Filter的生命周期由Servlet容器管理,而Interceptor通过Ioc容器来管理,可通过注入等方式来获取其Bean的实例;3. Filter可拦截所有web资源(包括Jsp,Servlet,静态资源),而Interceptor则只拦截Controller。
异常处理
A.全局异常处理器
@RestControlleradvice
@ExceptionHandler
B.异常都抛出到表现层
国际化
文件上传
@Service
public class FileStorageService {
// 存储路径,可从配置文件中读取
private final Path fileStorageLocation;
public String store(MultipartFile file) throws Exception {
// 生成唯一文件名防止冲突
String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
// 解析存储路径
Path targetLocation = this.fileStorageLocation.resolve(fileName);
// 复制文件到目标位置
Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
return fileName;
}
}
public class FileStorageService {
// 存储路径,可从配置文件中读取
private final Path fileStorageLocation;
public String store(MultipartFile file) throws Exception {
// 生成唯一文件名防止冲突
String fileName = UUID.randomUUID().toString() + "_" + file.getOriginalFilename();
// 解析存储路径
Path targetLocation = this.fileStorageLocation.resolve(fileName);
// 复制文件到目标位置
Files.copy(file.getInputStream(), targetLocation, StandardCopyOption.REPLACE_EXISTING);
return fileName;
}
}
传参问题
json数据传参问题
导入 jackson-databind依赖
SpringMvcConfig上加上注解@EnableWebMvc 开启json转对象功能(根据类型匹配对应的类型转换器)
日期传参问题
Date 对象
默认为year/month/day 形式
在对象属性上添加 @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
使用流程
1.导入spring-webmvc依赖和javax.servlet-api依赖(servelet需要配置scope属性为provided,避免与tomcat插件冲突)
2.创建SpringMVC控制器类(Controller类)
3.创建一个SpringMvcConfig配置类去加载Controller类
4.定义一个severlet容器启动的配置类继承AbstractDispatcherServeletInitializer
ctx=new AnnotationConfigWebApplicationContext
ctx.register(SpringMvcConfig.class)
4.1 继承AbstractAnnotationConfigDispatcherServletInitializer(简单方法)
解决Post中网页编码导致的乱码问题
重写 getServerletFilters()
创建一个CharacterEncodingFilter()
filter.setEncoding("UTF-8")
return new Filter[]{filter,...,}(可以添加多个过滤器)
4.2 放行与规定路线 编写一个SpringMvcSupport 类继承WebMvcConfigurationSupport 重写 addResourceHandlers 方法 registry.addResourceHandler("/pages/**").addResourceLocations("/pages/") 然后使其能够被扫描到
注解
Controller 层 请求路径绑定处理函数
@RequestMapping
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
接受参数和返回结果
接收参数
@RequestParam
URL查询字符串(?后面的参数 如?id=123)
用于接收url地址传参或表单传参
@PathVariable
接收路径参数,使用{参数名称}描述路径参数
以类形式接收
@RequestBody
将HTTP请求体的数据绑定到方法参数 与@POST@PUT@PATCH 配套使用 标记参数 用于反序列化数据为对象
@ModelAttribute
用于 GET 请求,从 URL 查询参数 中绑定数据
返回结果
@RestController
可以将其视为 @Controller 和 @ResponseBody 注解的组合
Maven高级
分模块开发
聚合
继承
属性
版本管理
SNAPSHOT
快照版本
RELEASE
发布版本
配置文件加载属性
多环境配置
profiles书写
mvn install -p "id"(使用指定id的环境运行)
跳过测试快速打包
闪电图标
mvn install -D skipTests
书写plugins
maven-surefire-plugin
书写配置
私服(团队开发)
Nexus 服务器
下载
代理仓库(proxy)
代理连接中央仓库
仓库组(group)
为仓库编组简化下载操作
上传
宿主仓库(hosted)
保存自主研发+第三方资源
使用步骤
1.编辑maven目录下的confi\settings.xml 中的servers server 增加仓库名和账号密码(增加权限)
2.配置mirrors mirror的镜像路径
3.配置 当前工程保存在私服中的具体位置 pom文件中 distributionManagement repository
4.maven生命周期 deploy 发布
作用
依赖jar包管理
统一项目结构
快速构建项目
SpringBoot框架
打包
执行package 打jar包 运行java -jar jar包路径 运行项目
依赖
GAV
仅书写GA,版本由Spring-parent提供
配置文件(优先级由上到下)
application.properties
application.yml(主流)
一种数据序列化的格式
大小写敏感
属性值前需要加空格
获取数据
使用变量名获取
注入Environment对象,使用environment.getProperty("")获取属性
自定义一个配置类 使用@ConfigurationProperties(prefix="名称")标记后注入
多环境配置
不同环境使用---分割
使用profiles:设置名称
active设置启动环境
命令启动 java -jar --spring.profiles.active=test --server.port=8080
application.yaml
MyBatis-Plus框架
IPage<T> selectPage(IPage<T> page)
分页查询
IPage page=new Page(1,2)
(每页,每页多少条)
Ipage<T> selectPage(Wrapper<T> queryWrapper)
按条件查询
selectMaps(lqw)
分页功能需要配置拦截器
定义MybatisPlusInterceptor拦截器
增加拦截器PaginationInnerInterceptor
逻辑删除
字段创建
@TableLogic(value="0",delval="1")
逻辑删除字段
Wrapper
queryWrapper
查询条件的封装
qw.lt("key",value)大于
qw.lambda().lt(User::getAge,value)
条件
between
lt
le
gt
ge
eq
UpdateWrapper
有Set语句
依赖于@TableField
LambdaQueryWrapper<User>
qw.lt("key",value)大于
可以添加多个条件,并列或者链式增加
.(and)
.or().(或者)
条件过滤
lqw.lt(null!=uq.getAge2(),User::getAge,uq.getAge2())
LambdaUpdateWrapper<User>
LambdaQueryChainWrapper<User>
把查询条件和查询函数链接在一起使用
LambdaUpdateChainWrapper<User>
注解
@TableField(exit=false)
@TableName("")
@TableId(type=Assign.id)
@Indexed
加速索引注解
MyBatis 框架
注解
@Param
方法有多个参数
参数是集合或数组
参数是 Map 或复杂对象时
参数是集合或数组
参数是 Map 或复杂对象时
@Mapper
@MapperScan
@SelectKey
@Select @Insert @Delete @Update
标签
静态标签
sql操作
select updatae insert delete set
集合
collection
结果集映射
resultMap
动态标签
执行控制
if else choose-when-otherwise foreach
多余符号处理
trim where sset
封装结果使用无参构造
& 转义字符 在绑定参数查询时才需要
Junit 框架
DML编程控制
id生成策略
@TableId(type=**)
AUTO
NONE
UUID
ASSIGN_ID
雪花算法
占位符(0)+时间戳(41)+机器码(5+5)+序列号(12)
乐观锁
秒杀
增加字段version 注解@Version
开启拦截器
Spring框架
Spring Framework 系统架构
Core Container(核心容器)
Beans
Spring Beans是由Spring IoC 容器实例化,依赖注入和管理的对象
FactoryBean
Spring 容器中一种特殊的“工厂Bean”,用于创建另一种类型的对象。
expression(SpEL)
Spring 表达式语言,支持在运行时查询和操作对象(如 #{user.name})
core
基础工具类(如资源加载、反射工具)。
实现 IoC(控制反转) 的核心支持。
实现 IoC(控制反转) 的核心支持。
context
Spring Context(ApplicationContext)是 Spring IoC 容器的核心接口,代表 Spring 应用的运行时环境。
扩展功能
国际化
事件机制
资源加载
环境配置
Bean管理(BeanFactory有关功能)
注册Bean
获取Bean
依赖注入
BeanFactory
IOC 容器本身
AOP 与 Instrumentation(面向切面编程与类加载器增强)
aop
提供 AOP(面向切面编程) 的基础支持(如代理机制)。
实现日志、事务、权限等横切逻辑(结合 @Aspect 使用)。
实现日志、事务、权限等横切逻辑(结合 @Aspect 使用)。
DefaultSingletonBeanRegistry(AbstractApplicationContext 的间接父类)
三级缓存问题
一级缓存
储存成品对象(实例化且初始化对象 map<beanName,A@17777>)
二级缓存
储存半成品(实例化但未初始化对象 map<beanName,原始对象 或 提前生成的代理对象>)
三级缓存
储存ObjectFactory工厂对象(map<beanName,lambda>)
aspects
集成 AspectJ(更强大的 AOP 框架,支持编译时织入)。
instrument
用于 JVM 级别的类加载器增强(如字节码增强,适用于性能监控等场景)。
Data Access/Integration(数据访问与集成)
jdbc
提供 JDBC 模板(JdbcTemplate),避免手动处理连接和异常。
tx
声明式 事务管理(通过 @Transactional 注解)。
orm
集成 ORM 框架(如 Hibernate、JPA、MyBatis)。
oxm
对象与 XML 的映射支持(如 JAXB、XStream)。
jms
简化 JMS(Java 消息服务)操作,支持消息队列(如 ActiveMQ)。
Web Layer(Web开发)
web
基础 Web 功能(如 HTTP 客户端、REST 支持)。
webmvc
Servlet 栈的 MVC 框架(基于 DispatcherServlet,支持 @Controller)。
websocket
WebSocket 通信支持(实时双向数据传输)。
webflux
响应式 Web 框架(基于 Reactor,支持非阻塞 IO)。
Test(单元测试)
Spring 启动原理(选看,不重要)
1.准备 (prepareRefresh) ->
1.设置容器的启动日期、激活标志,初始化属性源(PropertySources)和验证环境属性等。不涉及BeanFactory的实例化、装配、初始化、销毁。
2.对于 AbstractRefreshableApplicationContext(如 ClassPathXmlApplicationContext),此方法会创建一个新的 DefaultListableBeanFactory 实例并且立刻填充。
对于 GenericApplicationContext(如 AnnotationConfigApplicationContext),BeanFactory 通常在构造函数中就已经被创建,此方法只是返回已有的实例,尚未填充。
对于 GenericApplicationContext(如 AnnotationConfigApplicationContext),BeanFactory 通常在构造函数中就已经被创建,此方法只是返回已有的实例,尚未填充。
3.这是对 BeanFactory 的基础配置阶段:
设置类加载器 (setBeanClassLoader)
设置表达式解析器 (setBeanExpressionResolver) 用于 SPEL(#解析)
添加属性编辑器注册器 (addPropertyEditorRegistrar)
添加 ApplicationContextAwareProcessor(用于处理各种 Aware 接口)
忽略某些接口的依赖注入(如 EnvironmentAware、ResourceLoaderAware)
注册可解析的依赖(如将 BeanFactory 自身注册为可注入的依赖)
设置类加载器 (setBeanClassLoader)
设置表达式解析器 (setBeanExpressionResolver) 用于 SPEL(#解析)
添加属性编辑器注册器 (addPropertyEditorRegistrar)
添加 ApplicationContextAwareProcessor(用于处理各种 Aware 接口)
忽略某些接口的依赖注入(如 EnvironmentAware、ResourceLoaderAware)
注册可解析的依赖(如将 BeanFactory 自身注册为可注入的依赖)
5.这是对 BeanFactory 的增强配置阶段:
调用所有 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor
前者者专注于添加新的Bean定义,后者允许修改所有(包括第一阶段新添加的)Bean定义的元数据。这是“调整”的阶段。
例如:PropertySourcesPlaceholderConfigurer 处理 ${...} 占位符
例如:ConfigurationClassPostProcessor 处理 @Configuration 类并注册新的 Bean 定义
调用所有 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor
前者者专注于添加新的Bean定义,后者允许修改所有(包括第一阶段新添加的)Bean定义的元数据。这是“调整”的阶段。
例如:PropertySourcesPlaceholderConfigurer 处理 ${...} 占位符
例如:ConfigurationClassPostProcessor 处理 @Configuration 类并注册新的 Bean 定义
6.注册处理器 (registerBeanPostProcessors):
注册所有 BeanPostProcessor,这些处理器将在 Bean 创建过程中发挥作用
此时 BeanFactory 已经具备了处理 Bean 生命周期的能力
注册所有 BeanPostProcessor,这些处理器将在 Bean 创建过程中发挥作用
此时 BeanFactory 已经具备了处理 Bean 生命周期的能力
11.创建Bean (finishBeanFactoryInitialization):
这是 BeanFactory 开始"生产工作"的关键时刻
它需要实例化所有非延迟初始化的单例 Bean
在这个过程中,BeanFactory 会使用之前注册的所有 BeanPostProcessor 来处理每个 Bean 的生命周期
这是 BeanFactory 开始"生产工作"的关键时刻
它需要实例化所有非延迟初始化的单例 Bean
在这个过程中,BeanFactory 会使用之前注册的所有 BeanPostProcessor 来处理每个 Bean 的生命周期
2. 获取工厂 (obtainFreshBeanFactory) ->
3. 配置工厂 (prepareBeanFactory) ->
4. 后处理工厂 (postProcessBeanFactory) ->
5. 处理配置 (invokeBeanFactoryPostProcessors) ->
6. 注册处理器 (registerBeanPostProcessors) ->
7. 消息国际化 (initMessageSource) ->
8. 事件机制 (initApplicationEventMulticaster) ->
9. 子类扩展 (onRefresh) ->
10. 注册监听 (registerListeners) ->
11. 创建Bean (finishBeanFactoryInitialization) ->
12. 收尾发布 (finishRefresh)
实例化过程createBeanInstance(也叫做Bean生命周期,生命周期中的使用和销毁不在此讨论)
getBean() ->doGetBean()->
createBean() -> doCreateBean
createBeanInstance():创建 Bean 的原始实例(调用构造方法)。
invokeAwareMethods():调用 Aware 接口方法(为 Bean 注入一些基础信息)。
populateBean():填充 Bean 的属性(进行依赖注入,如 @Autowired, @Value)。
执行前置处理方法(BeanPostProcessor)
执行初始化方法 init-method()
XML 显式配置
@Bean(initMethod="")
@PostConstruct
判断是否实现了InitialiazingBean接口,是则调用afterPropertiesSet 方法(给用户最后一次机会来进行属性的赋值或者修改)
执行顺序
1.@PostConstruct 注解的方法
2.InitializingBean 接口的 afterPropertiesSet() 方法(如果实现了该接口)
3.自定义的 init-method 方法 (查找顺序,没有则跳过该阶段)
2.InitializingBean 接口的 afterPropertiesSet() 方法(如果实现了该接口)
3.自定义的 init-method 方法 (查找顺序,没有则跳过该阶段)
1.容器环境准备->
2.工厂实例化->
3.配置工厂->
5.处理配置->
6.注册处理器->
11. 创建Bean
1.设置容器的启动日期、激活标志,初始化属性源(PropertySources)和验证环境属性等。不涉及BeanFactory的实例化、装配、初始化、销毁。
2.对于 AbstractRefreshableApplicationContext(如 ClassPathXmlApplicationContext),此方法会创建一个新的 DefaultListableBeanFactory 实例并且立刻填充。
对于 GenericApplicationContext(如 AnnotationConfigApplicationContext),BeanFactory 通常在构造函数中就已经被创建,此方法只是返回已有的实例,尚未填充。
对于 GenericApplicationContext(如 AnnotationConfigApplicationContext),BeanFactory 通常在构造函数中就已经被创建,此方法只是返回已有的实例,尚未填充。
3.这是对 BeanFactory 的基础配置阶段:
设置类加载器 (setBeanClassLoader)
设置表达式解析器 (setBeanExpressionResolver) 用于 SPEL(#解析)
添加属性编辑器注册器 (addPropertyEditorRegistrar)
添加 ApplicationContextAwareProcessor(用于处理各种 Aware 接口)
忽略某些接口的依赖注入(如 EnvironmentAware、ResourceLoaderAware)
注册可解析的依赖(如将 BeanFactory 自身注册为可注入的依赖)
设置类加载器 (setBeanClassLoader)
设置表达式解析器 (setBeanExpressionResolver) 用于 SPEL(#解析)
添加属性编辑器注册器 (addPropertyEditorRegistrar)
添加 ApplicationContextAwareProcessor(用于处理各种 Aware 接口)
忽略某些接口的依赖注入(如 EnvironmentAware、ResourceLoaderAware)
注册可解析的依赖(如将 BeanFactory 自身注册为可注入的依赖)
5.这是对 BeanFactory 的增强配置阶段:
调用所有 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor
前者者专注于添加新的Bean定义,后者允许修改所有(包括第一阶段新添加的)Bean定义的元数据。这是“调整”的阶段。
例如:PropertySourcesPlaceholderConfigurer 处理 ${...} 占位符
例如:ConfigurationClassPostProcessor 处理 @Configuration 类并注册新的 Bean 定义
调用所有 BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor
前者者专注于添加新的Bean定义,后者允许修改所有(包括第一阶段新添加的)Bean定义的元数据。这是“调整”的阶段。
例如:PropertySourcesPlaceholderConfigurer 处理 ${...} 占位符
例如:ConfigurationClassPostProcessor 处理 @Configuration 类并注册新的 Bean 定义
6.注册处理器 (registerBeanPostProcessors):
注册所有 BeanPostProcessor,这些处理器将在 Bean 创建过程中发挥作用
此时 BeanFactory 已经具备了处理 Bean 生命周期的能力
注册所有 BeanPostProcessor,这些处理器将在 Bean 创建过程中发挥作用
此时 BeanFactory 已经具备了处理 Bean 生命周期的能力
11.创建Bean (finishBeanFactoryInitialization):
这是 BeanFactory 开始"生产工作"的关键时刻
它需要实例化所有非延迟初始化的单例 Bean
在这个过程中,BeanFactory 会使用之前注册的所有 BeanPostProcessor 来处理每个 Bean 的生命周期
这是 BeanFactory 开始"生产工作"的关键时刻
它需要实例化所有非延迟初始化的单例 Bean
在这个过程中,BeanFactory 会使用之前注册的所有 BeanPostProcessor 来处理每个 Bean 的生命周期
涉及对象
核心功能
BeanFactory
实例化 (Instantiation):根据 BeanDefinition,通过反射调用构造器创建 Bean 实例。
装配 (Population):进行依赖注入(DI),填充 Bean 的属性。
初始化 (Initialization):调用初始化回调(如 InitializingBean, init-method, BeanPostProcessor)。
销毁 (Destruction):在容器关闭时调用销毁方法。
提供查询能力:通过 getBean 方法为应用提供获取 Bean 的入口。
装配 (Population):进行依赖注入(DI),填充 Bean 的属性。
初始化 (Initialization):调用初始化回调(如 InitializingBean, init-method, BeanPostProcessor)。
销毁 (Destruction):在容器关闭时调用销毁方法。
提供查询能力:通过 getBean 方法为应用提供获取 Bean 的入口。
提供容器和基本的依赖注入(构造器,setter,xml基本属性注入)
扩展功能
PostProcessor
BeanFactoryPostProcessor
在 Bean 实例化之前。此时,所有的 BeanDefinition 已经被加载和注册到容器中,但还没有任何一个 Bean 被实例化。
可以修改、添加甚至移除已有的 BeanDefinition。它操作的是 Bean 的元数据(蓝图)
BeanPostProcessor
在 Bean 实例化之后、初始化前后。它操作的是已经创建出来的 Bean 实例对象。
对 Bean 实例进行包装、代理或增强。它可以返回原始 Bean,也可以返回一个全新的代理对象。
Aware 接口族
让 Bean 能“感知”到容器的基础设施。如 ApplicationContextAware(获取容器)、BeanNameAware(获取自身 beanName)。这是一种回调式扩展。
将Spring 框架本身的容器对象或基础设施(如 BeanFactory, ApplicationContext)“注入” 给这个 Bean
普通的 @Autowired 是在 Bean 属性填充阶段进行的。Aware 接口的回调发生得更早,它为 Bean 提供了一个在生命周期早期就能获取容器基础设施的入口,从而能够进行更灵活的操作
ApplicationContexrAware
BeanFactoryAware
EnvironmentAware
Import 系列
ImportSelector
ImportBeanDefinitionRegister
DeferredImportSelector
生命周期系列
InitializingBean
DisposableBean
SmartInitializingSingleton
Lifiecycle
SmartLifecycle
FactoryBean
用于定制复杂的创建逻辑。如果一个 Bean 的实现非常复杂,无法在配置中清晰表达,可以实现 FactoryBean 接口,将复杂的创建过程封装在 getObject() 方法中。
用于创建其他 Bean 的工厂 Bean。它本身是一个 Bean,被注册到 Spring 容器中,但它的使命不是为自己服务,而是作为一个工厂,负责创建并返回另一个对象(目标对象)的实例。
注册:你将一个实现了 FactoryBean 接口的类(例如 MyFactoryBean)注册到容器中,就像注册一个普通 Bean 一样。
获取:当你在 ApplicationContext 中通过 getBean(String name) 方法请求这个 Bean 时,Spring 容器不会返回 MyFactoryBean 本身的实例,而是会调用它的 getObject() 方法,并返回这个方法所返回的对象(即产品)。
获取工厂本身:如果你确实想获取 FactoryBean 本身的实例,而不是它生产的对象,需要在 bean name 前加上 & 符号。例如 getBean("&myFactoryBean")。
获取:当你在 ApplicationContext 中通过 getBean(String name) 方法请求这个 Bean 时,Spring 容器不会返回 MyFactoryBean 本身的实例,而是会调用它的 getObject() 方法,并返回这个方法所返回的对象(即产品)。
获取工厂本身:如果你确实想获取 FactoryBean 本身的实例,而不是它生产的对象,需要在 bean name 前加上 & 符号。例如 getBean("&myFactoryBean")。
自定义作用域 (Scope)
Spring 默认有 singleton 和 prototype 作用域。你可以通过实现 Scope 接口,注册自定义的作用域(如集群环境下的 cluster 作用域)。
定义了 Spring 容器中 Bean 的生命周期和可见性——即这个 Bean 实例在什么范围内是“单例”的。
ApplicationListener / ApplicationEvent
观察者模式的实现。你可以发布自定义事件,并编写监听器来响应这些事件,实现 Bean 之间的解耦通信。
ImportSelector / ImportBeanDefinitionRegistrar
与 @Import 注解配合使用,用于在编程式地、条件性地动态注册 BeanDefinition,是 Spring Boot 自动配置的底层基石。
**`ImportSelector`**:更侧重于选择导入哪些配置类(返回类名数组),由Spring容器负责后续的Bean定义注册。它相对简单,适用于根据条件选择配置类的场景。
- **`ImportBeanDefinitionRegistrar`**:更底层,它直接参与到Bean定义的注册过程中,可以编程式地构建和注册Bean定义,提供了更大的灵活性。
- **`ImportBeanDefinitionRegistrar`**:更底层,它直接参与到Bean定义的注册过程中,可以编程式地构建和注册Bean定义,提供了更大的灵活性。
注解
Lombok 注解
@Data(需要导入lombok依赖)
@Setter
@Getter
@ToString
@EqualAndHashCode
@NoArgsConstructor
无参构造方法
@AllArgsConstructor
有参构造方法
@Slf4j
属性绑定 注解
@Value(${})
简单类型的赋值
@Import
导入配置类,多个使用数组作为参数
@Required
强制检查某个 Bean 属性是否被正确注入(即是否非空)
@ResponseBody
将方法返回值写入HTTP响应体 标记方法
@PathVariable
路径参数
@RequestParam
查询参数(带?号)
@RequestHeader
@RequestAttribute
Bean 声明注解
类 声明
@Component
@Controller
Web控制器
@Controller:
DispatcherServlet 会专门查找被 @Controller 注解的Bean。
它会扫描这些Bean中的方法,寻找 @RequestMapping 及其衍生注解(@GetMapping, @PostMapping等),建立URL到方法的映射关系。
当请求到来时,根据映射关系调用对应的控制器方法。
@Component:
被 @Component 注解的类只是一个普通的Bean,不会被 DispatcherServlet 特殊对待。
它内部的方法不会被扫描和映射为HTTP端点。
DispatcherServlet 会专门查找被 @Controller 注解的Bean。
它会扫描这些Bean中的方法,寻找 @RequestMapping 及其衍生注解(@GetMapping, @PostMapping等),建立URL到方法的映射关系。
当请求到来时,根据映射关系调用对应的控制器方法。
@Component:
被 @Component 注解的类只是一个普通的Bean,不会被 DispatcherServlet 特殊对待。
它内部的方法不会被扫描和映射为HTTP端点。
@Repository
数据仓库(DAO层)
@Service
业务服务
配置类 声明
@Configuration
@Configuration是与@Bean配套使用
@Bean
将方法的返回值标记为Bean
@PropertySource("classpath:mail.properties")
加载指定的propeties文件
依赖注入
@Autowire
将Spring容器中已有的 Bean对象自动注入 到目标位置@Autowired 的字段、构造函数或方法中
@Qualifier("name")
与@Autowire配套使用,选择指定名称的Bean注入
@Resource
按照名称注入
@ConfigurationProperties(prefix = "mail")
@ConfigurationProperties 是 Spring Boot 提供的一个强大注解,用于将外部配置文件中的属性批量绑定到 Java Bean 中。当与 prefix 属性一起使用时,它可以实现配置属性的结构化绑定,prefix 扫描所有以mail开头的属性。
Bean 设置注解
设置作用域
@Scope
是否单例
Aop 注解(下文介绍)
aop增强
@Aspect
@Before
@After
@Around
@AfterReturning
@AfterThrowing
@Poinitcut
Spring 生命周期 扩展时期 注解
@PostConstruct
构造方法后运行的方法
@PreDestroy
销毁前
spring 配置 注解
@ComponentScan
@EnableAutoConfiguration
修饰自定义注解(元注解)
@Target()
表达这个注解用在什么地方
@Retension()
在什么级别保存这个注解信息
@Documented
这个注解锁修饰的类可以被抽取成doc文档
@Inherited
可传递 可继承
AOP(面向切面编程)
核心概念
JoinPoint连接点
Joinpoint不仅仅指目标对象上定义的方法。在AOP中,Joinpoint表示程序执行过程中的特定点,如方法调用、方法执行、异常处理、字段访问等
PointCut切入点
要追加功能的方法
Advice通知
追加的功能方法
通知类
切入点执行的操作 共性功能
Aspect切面:PointCut + Advice
描述通知与切入点的对应关系
具体使用
@EnableAspectJAutoProxy
用于配置类,表示启用切面
@Aspect
用于标识这个是通知类,同时需要使用@Component标识这是一个Bean
@Pointcut
用于标识这个方法是一个切入点,需要使用execution去标识具体得到切入位置 如@Pointcut("execution(void com.itheima.dao.BookDao.update()))") private void pt(){} 可以使用正则表达式匹配多个方法
通知
前置通知
@Before
用于标识通知方法 同时需要注明切入点 如@Before("pt()")
后置通知
@After
环绕通知
@around
前后切入,前部操作 原始操作(pjp.proceed) 后部操作 而且切入方法需要与原始方法一致
Public object aound(ProceedingJoinPoint pjp)throws Throwable
返回后通知
@AfterReturning
抛出异常后通知
@AfterThrowing
获取参数,JoinPoint jp jp.getArgs();
实际运用
验证传入数据是否符合要求以及数据的兼容处理
代理对象
Spring选择懒加载
使用事务管理(@Transactional)
使用Spring缓存(@Cacheable)
其他Spring内置AOP功能
通过动态代理技术在不修改源代码的情况下增强程序功能的编程方式
CGLIB动态代理
CGLIB代理无法代理private方法
通过ASM在运行时动态的生成目标类的子类,相关类会生成多个
重写父类所有的方法增强代码,final类无法继承
调用时先通过代理类增强,直接调用父类对应的方法进行调用目标方法,从而实现AOP
JDK动态代理
JDK动态代理只能代理接口方法
运行时生成动态代理类$proxy*.class
实现目标类接口的一个类,而且会实现接口所有的方法增强代码
调用时先调用代理类去调用处理类增强,再通过反射的方式进行调用目标方法,从而实现AOP
只提供实现接口的代理,不支持类的代理
事务
注解
@Transactional
开启注解
标准标识在Service接口上,表示开启事务
事务注解失效
自调用问题:类内部方法调用同类中的@Transactional方法,事务不会生效。因为事务是基于AOP代理的,自调用不会经过代理对象。
异常类型不正确:默认情况下,只有抛出RuntimeException和Error才会回滚。如果抛出的是受检异常(Checked Exception),事务不会回滚。
异常被捕获:如果在方法中捕获了异常,而没有重新抛出,事务不会回滚。
注解在非public方法上:@Transactional只能应用于public方法,否则不会生效。
事务传播设置不正确:例如,如果方法的事务传播行为设置为NOT_SUPPORTED、NEVER等,则不会开启事务。
数据库引擎不支持事务:例如,MySQL的MyISAM引擎不支持事务,只有InnoDB支持。
使用了多个事务管理器,但没有指定使用哪一个(例如,使用@Transactional(value="txManager1")来指定)。
事务方法内开启多线程,每个线程的事务是不相关的,因为事务信息通常与线程绑定。
使用AopContext.currentProxy()解决自调用问题),或者需要强制使用CGLIB代理,那么就需要显式添加@EnableAspectJAutoProxy注解并设置相应属性。
@EnableTransactionManagement
标识在配置类上
选择一个事务管理器
JDBC
创建一个 PlatformTransactionManager Bean方法 创建一个DataSourceTransactionManager类
角色
管理员
开启事务的方法
协调员
开启事务的方法内的方法
回滚
默认
回滚异常
error
运行时异常
子主题
子主题
rollbackFor
可以增加可以令事务回滚的异常事件
propagation
设置协调员的态度 是否愿意加入事务
传播行为
0 条评论
下一页