Spring核心知识点详解
2025-01-15 17:19:34 8 举报
AI智能生成
Spring框架是Java企业版(Java EE)的轻量级替代品,它简化了企业级应用开发。核心知识点包括依赖注入(DI)和控制反转(IoC)机制,这是Spring容器的核心功能,允许将组件的配置和依赖关系管理从代码中解耦出来。此外,Spring提供了面向切面编程(AOP),允许横切关注点(如日志、事务管理)与业务逻辑分离。Spring MVC支持构建Web应用程序,而Spring Boot为创建和部署独立的、生产级别的基于Spring的应用程序提供了便利。Spring Data简化了数据访问层的实现,而Spring Security提供了全面的安全性解决方案。Spring框架文件类型通常包括`.java`源代码文件、XML配置文件(虽然Spring 3之后逐渐被Java配置所取代)以及用于自动化测试的`.java`或`.xml`测试配置文件。描述的修饰语应强调其模块化、开源、灵活、易用、高效和广泛社区支持的特点。
作者其他创作
大纲/内容
Spring基础
什么是Spring框架
Spring 是基于java开发的以IOC和AOP为核心的轻量级低侵入式框架,
是java开发非常流行的框架,可以用来快速搭建一个java项目。
是java开发非常流行的框架,可以用来快速搭建一个java项目。
Spring IOC
Spring XML 方式
引入spring maven依赖
定义期望创建的类
User类定义
创建springXML配置文件
xml配置
从spring容器中获取Bean
使用对象
Spring Config方式
注解介绍
@Component/@Repository/@Service/@Controller
声明一个类可成为bean
@Configuration
声明一个类为Spring的主配置类
@ComponentScan
声明包扫描路径,一般加在主配置类上
@PropertySource
读取配置文件注解
@Value
从spring上下文环境变量中取出指定值
@Import
导入bean
创建bean相关接口
ImportSelector
结合@Import注解批量注册bean接口,返回类的全限定名称数组
ImportBeanDefinitionRegistrar
结合@Import注解自定义创建bean
声明配置类
@Configuration
声明包扫描路径
@ComponentScan("com")
读取配置文件
@PropertySource/@Value
注册类到IOC容器中
@Component方式
@Bean方式
@Import方式
UserDaoImpl 是没有任何注解和其他描述的普通类
通过ImportSelector接口和@Import结合批量注册
这里的Student和Teacher 都是普通类,没有加任何注解;@Import 导入MyImportSelector
通过ImportBeanDefinitionRegistrar接口和@Import结合自定义创建
@Import 导入MyImportBeanDefinitionRegistrar
创建Spring容器
从spring容器从获取user对象
Spring AOP
什么是AOP
OOP是面向对象编程,AOP是在面向对象编制基础上的一种新的编程思想。它能在不改变原对象代码逻辑的情况下,在原对象执行前后植入新的代码逻辑,达到增强对象功能的目的。如:日志处理、事务实现、安全管理等
代理模式
静态代理
代码实现
动态代理
JDK动态代理
代理对象
InvocationHandler实现
Proxy创建动态代理对象
CJLIB动态代理
CJLIB代码实现
Spring AOP实现
开启AOP
引入Spring AOP相关依赖
配置类上添加开启Spring AOP注解,@EnableAspectJAutoProxy
创建被代理类
被代理类
创建切面
创建切面类,添加注解:@Aspect
编写切点表达式
切点表达式用来定位被代理类
切点表达式
添加增强逻辑
前置通知实现
添加前置通知注解:@Before
后置返回通知实现
添加后置返回通知注解:@AfterReturning
后置异常通知实现
添加后置异常通知注解:@AfterThrowing
后置通知实现
添加后置通知注解:@After
环绕通知实现
添加环绕通知注解:@Around
Spring AOP 核心概念
切面(Aspect)
表示切面,如@Aspect注解的类就是切面,可以在切面中定义Pointcut、Advice等等
连接点(Join point)
表示一个程序在执行过程中的一个点,比如一个方法执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行
通知(Advice)
表示在一个特点的连接点上所采取的动作(前置通知、后置返回通知......)
切点(Pointcut)
用来匹配一个或多个连接点,Advice与切点表达式市关联在一起的,Advice将会执行在和切点表达式匹配的连接点上
Spring 声明式事务
什么是事务
把一组事务当做一个事务来执行,这一组事务要么都执行成功,要么都执行失败。保证操作的完整性
事务特性
原子性(A)
一致性(C)
隔离性(I)
持久性(D)
事务分类
编程式事务
声明式事务
Spring事务代码示例
核心依赖
mavn引入依赖
Spring主配置文件中添加注解开启服务支持:
@EnableTransactionManagement
@EnableTransactionManagement
添加注解
事务管理器设置DataSource数据源
设置数据源
方法或者类上添加注解开启事务:
@Transactional
@Transactional
开启事务
Spring 事务属性设置
隔离级别@Transactional(isolation = Isolation.REPEATABLE_READ)
传播属性@Transactional(propagation = Propagation.REQUIRED)
超时时间@Transactional(timeout = 2)
只读属性@Transactional(readOnly = true)
异常属性@Transactional(noRollbackFor=RuntimeException.class)
Spring底层核心原理
Spring创建对象过程
1. 解析AppConfig配置文件,得到ComponentScan定义的扫描路径
2. 扫描路径下可成为Bean的类型(标注有@Component、@Service、@Controller等注解的类),通过特点算法从类中获取到beanName(类名称的首字母小写)。以beanNmae为key ,class和属性信息为value 放入一个map中
3. 遍历上面的map ,通过类和其属性创建对象(bean),放入key为benName,value为bean对象的map中
4. context.getBean("userService") 就是从Spring容器中(上述的map)通过beanName获取到创建的Bean
Bean的生命周期
实例化
依赖注入
Aware回调
初始化前
初始化
初始化后
推断构造方法
如果一个类只存在一个构造方法,不管该构造方法是无参还是有参构造方法,Spring都会用这个构造方法进行实例化。
如果一个类有多个构造方法
a.这些构造方法中,存在一个无参构造方法,那么Spring会使用这个无参构造方法进行实例化bean
b.这些构造方法中,不存在无参构造方法,那么Spring会报错。
如果一个类有多个构造方法,某个构造方法上加了@Autowired注解,那么Spring就会用这个加了注解的构造方法进行实例化。
如果Spring选择了有入参的构造方法
a.先根据类型去找,如果找到一个,直接用来作为入参
b.如果根据类型找到多个,则在根据入参的名称来确定唯一一个
c.如果最终都没有找到,Spring则会报错,无法创建当前Bean对象
Spring AOP实现
1. 找出所有的切面Bean,也就是被@Aspect注解标注的Bean
2. 遍历切面中的每个方法,找出标识了@Before、@After等注解的方法
3. 如果标识了,则判断对应的PointCut是否和当前Bean对象的类是否匹配
4. 如果匹配则表示当前Bean对象有匹配的PointCut,需要进行AOP
5. 判断Bean是否继承了接口,然后通过JDK动态代理或者CGLIB动态代理创建代理类
6. 将代理对象作为bean放入spring容器中
Spring 事务实现
事务动态代理创建
事务执行
1.判断当前执行的方法是否存在@transactional注解
2.如果存在,则利用事务管理器(TransactionManager)新建一个数据库连接
3.修改数据库连接的autocommit 为false
4.执行target目标方法
5.执行完成后如果没有异常则提交,否则回滚
Spring事务是否失效判断
加了@transactional注解的方法被调用时,判断当前是不是直接被代理对象调用,如果是则事务生效,如果不是则失效。
Spring源码剖析
核心概念
BeanDefinition
BeanDefinitionReader
AnnotatedBeanDefinitionReader
XmlBeanDefinitionReader
ClassPathBeanDefinitionScanner
BeanFactory
DefaultListableBeanFactory
ApplicationContext
ApplicationContext接口
AnnotationConfigApplicationContext
AnnotationConfigApplicationContext容器
类型转换
PropertyEditor
ConversionService
TypeConverter
OrderComparator
AnnotationAwareOrderComparator
BeanPostProcessor
BeanFactoryPostProcessor
FactoryBean
ExcludeFilter和IncludeFilter
ExcludeFilter
表示扫描com.redis.cache.demo.dao包下的所有类,但是排除了ProductDao类,即使它上面有@Component注解也不会成为Bean
IncludeFilter
表示扫描com.redis.cache.demo.dao包下的所有类,包含ProductDao类,即使ProductDao没有加@Component注解,它也会被扫描成为一个Bean
FilterType
ANNOTATION:表示是否包含某个注解
ASSIGNABLE_TYPE:表示是否包含某个类
ASPECTJ: 表示否是符合某个Aspectj表达式
REGEX: 表示是否符合某个正则表达式
CUSTOM: 自定义
MetadataReader、ClassMetadata、AnnotationMetadata
SimpleMetadataReader
Bean生命周期解析
1. BeanDefinition解析
1.ResourcePatternResolver 获取指定包路径下的.class文件,Spring中会将文件包装成Resource对象
2.遍历每一个Resource对象,利用MetadataReaderFactory解析Resource对象得到MetadataReader
3.利用MetadataReader进行excludeFilters、includeFilters和条件注解@Conditional的筛选
4. 筛选通过后,基于MetadataReader生成ScannedGenericBeanDefinition
5. 再基于MetadataReader判断对应的类是不是接口或者抽象类(接口和抽象类是不能生成bean的)
6. 筛选通过后,就表示扫描到了一个Bean,将ScannedGenericBeanDefinition加入结果集(BeanDefinitionMap)
2. 合并BeanDefinition
3.类加载
4. 实例化前
5.Supplier创建对象
6.实例化
7.BeanDefinition的后置处理
8. 实例化后
9.依赖注入
10. Aware回调
11.初始化前
12.初始化
13.初始化后
依赖注入解析
XML中的Autowire自动注入
@Autowire注解自动注入
寻找注入点
查找过程
桥接方法
注入点注入
AutowiredAnnotationBeanPostProcessor 后置处理器进行依赖注入
关键方法
findAutowireCandidates()
determineAutowireCandidate()
循环依赖解析
什么是Spring的循环依赖
三级缓存
一级缓存SingletonObjects
二级缓存earlySingletonObjects
三级缓存singletonFactories
三级缓存解决循环依赖过程
AOP解析
Spring中的动态代理ProxyFactory
Advice的分类
Advisor
ProxyFactoryBean
BeanNameAutoProxyCreator
DefaultAdvisorAutoProxyCreator
@EnableAspectJAutoProxy注解开启AOP
Spring事务解析
@EnableTransctionManagement
Spring事务传播机制

收藏

收藏
0 条评论
下一页