Spring源码
2023-02-08 21:12:29 0 举报
AI智能生成
Spring源码思维导图
作者其他创作
大纲/内容
Spring底层核心原理解析
入门代码
SpringMVC创建的基于XML配置
XmlWebApplicationContext
ClassPathXmlApplicationContext
SpringBoot创建的基于注解
AnnatationConfigApplicationContext
Spring如何创建一个对象
解析AppConfig.class,得到扫描路径
遍历路径下所有类,发现类上有@Component@Service等注解,将这个类记录到BeanDefinitionMap中,是一个Map<String,Class>
Spring根据规则生成类对应的beanName,作为key存入Map中,类对象作为value
Bean的创建过程
通过类构造方法实例化对象,如果有多个方法,通过推断构造方法进行创建
判断该对象中属性有@Autowired注解,对应的进行依赖注入
当前对象是否实现了BeanNameAware,BeanClassLoaderAware,BeanFactoryAware接口,
如果实现了,则调用对应的setBeanName(),setBeanCLassLoader(),setBeanFactory方法
如果实现了,则调用对应的setBeanName(),setBeanCLassLoader(),setBeanFactory方法
Aware回调后,Spring会判断该对象中是否存在某个方法被@PostConstruct注解了,如果存在,
Spring会调用当前对象的此方法(初始化前)
Spring会调用当前对象的此方法(初始化前)
紧接着,Spring会判断该对象是否实现了InitializingBean接口,如果实现了,就表示当前对象必须实现该接口中的afterPropertiesSet()方法,
那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化)
那Spring就会调用当前对象中的afterPropertiesSet()方法(初始化)
最后,Spring会判断当前对象需不需要进行AOP,如果不需要那么Bean就创建完了,如果需要进行AOP,
则会进行动态代理并生成一个代理对象做为Bean(初始化后)
则会进行动态代理并生成一个代理对象做为Bean(初始化后)
推断构造方法
类只有一个构造方法,调用当前构造方法
有无参构造器也有其他构造方法,还是调用无参构造器
没有无参构造器,存在两个以及以上有参构造器,spring无法选择会报错
有参构造器入参对象如何找
根据入参类型找,只找到一个则直接用来入参
入参类型找到多个,根据入参名字确定唯一一个
最终无法找到则报错,无法创建Bean对象
AOP流程
判断是否要进行AOP
找出所有切面Bean
遍历每个方法是否有@Before@After等注解
有则判断对应Pointcut是否与当前Bean对象的类匹配
匹配则需要进行AOP
cglib进行AOP流程
代理类继承UserService生成UserServiceProxy
代理类重写父类方法,例如UserService中的test()
代理类有一个target属性,父类的对象,该属性的值是被代理对象
代理类中test()方法执行逻辑
执行切面逻辑(@Before)
调用被代理对象方法target.test()
Spring事务:@Transactional
判断当前执行方法是否有@Transactional注解
存在则通过事务管理器(TransactionMananger)新建一个数据库连接
修改自动提交关闭,autocommit=false
执行业务代码和sql
执行结果无异常则提交,异常则回滚
Spring事务是否会失效的判断标准:某个加了@Transactional注解的方法被调用时,
要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效
要判断到底是不是直接被代理对象调用的,如果是则事务会生效,如果不是则失效
Spring底层架构核心概念
BeanDefinition
部分属性
class:表示bean类型
scope:表示bean作用域
singleton 单例 ,默认情况
prototype 多例 ,每执行一次getBean()将会获得一个实例
适用于WebApplicationContext环境
request 每次HTTP请求都会创建一个
session 同一个HTTP Sessio共享一个,不session则不同bean
globalSession 用于Protlet应用环境
lazyInit:表示bean是否懒加载
initMethodName:表示bean初始化要执行的方法
destroyMethodName:表示bean销毁时要执行的方法
autowire(自动装配,默认为“no");它定义了Bean的自动装载方式
no:不使用自动装配功能
byName通过Bean的属性名实现自动装配
byType通过Bean的类型实现自动装配
constructor类似于by Type,但它是用于构造函改的参数的自动组装
autodetect通过Bean类约反省机制(introspection)决定是使用“constructor"
申明式定义Bean
<bean/>
@Bean
@Component(@Service,@Controller)
编程式定义Bean
通过BeanDefinition定义和设置属性
AnnotationConfigApplicationContext context = new
AnnotationConfigApplicationContext(AppConfig.class);
// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition =
BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
context.registerBeanDefinition("user", beanDefinition);
System.out.println(context.getBean("user"));
beanDefinition.setScope("prototype"); // 设置作用域
beanDefinition.setInitMethodName("init"); // 设置初始化方法
beanDefinition.setLazyInit(true); // 设置懒加载
AnnotationConfigApplicationContext(AppConfig.class);
// 生成一个BeanDefinition对象,并设置beanClass为User.class,并注册到ApplicationContext中
AbstractBeanDefinition beanDefinition =
BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
beanDefinition.setBeanClass(User.class);
context.registerBeanDefinition("user", beanDefinition);
System.out.println(context.getBean("user"));
beanDefinition.setScope("prototype"); // 设置作用域
beanDefinition.setInitMethodName("init"); // 设置初始化方法
beanDefinition.setLazyInit(true); // 设置懒加载
BeanDefinitionReader读取器
AnnotatedBeanDefinitionReader
将类直接转换为BeanDefinition并且可以解析类上@Conditional@Scope@Lazy@Primary@DependsOn
@Role@Description
@Role@Description
XmlBeanDefinitionReader
可以解析</bean>标签
ClassPathBeanDefinitionScanner
扫描器与读取器相似,扫描整个包路径,对扫描类上有@Component进行解析
BeanFactory
ApplicationContext接口
HierarchicalBeanFactory:拥有获取父BeanFactory的功能
ListableBeanFactory:拥有获取beanNames的功能
ResourcePatternResolver:资源加载器,可以一次性获取多个资源(文件资源等等)
EnvironmentCapable:可以获取运行时环境(没有设置运行时环境功能)
ApplicationEventPublisher:拥有广播事件的功能(没有添加事件监听器的功能)
MessageSource:拥有国际化功能
重要的两个类
AnnotationConfigApplicationContext
ClassPathXmlApplicationContext
Main Topic
Subtopic
Subtopic
0 条评论
下一页