做网站金山,自己设计logo网站,网站icp备案费用,wordpress手机发留言start 轻量级开源的j2ee框架#xff0c;容器框架 装javabean aop ioc 定义一个starter的jar包#xff0c;写一个configuration配置类#xff0c;将bean定义其中#xff0c;在starter包的meta-inf/spring.factories中写入配置类#xff0c;springboot会按约定加载该配置类 …start 轻量级开源的j2ee框架容器框架 装javabean aop ioc 定义一个starter的jar包写一个configuration配置类将bean定义其中在starter包的meta-inf/spring.factories中写入配置类springboot会按约定加载该配置类
ioc重中之重
配置文件配置包扫描路径 获取class文件 反射确定需要ioc管理的类 对需要注入的类依赖注入 定义一些注解控制层 业务层 数据持久层 依赖注入注解 获取配置文件 获取指定路径下的文件信息及文件夹信息class文件添加到set集合 遍历集合 获取指定注解的类 交给ioc安全的map存储对象 遍历ioc容器 获取类实例 判断是否依赖其他类实例 递归注入
ioc容器实际map存各种对象反射创建对象放入map中 代码需要用到里面的对象通过类型/(对象名)注入没有对象伤不起
控制反转需要对象时IOC主动创建/使用 对象
依赖注入IOC容器运行期间 动态将某种依赖关系注入到对象中
加载 spring框框干活一干一个不吱声
ioc容器读取配置信息 实例化 管理对象
bean定义描述 配置要管理的对象对象类名 属性 依赖关系
bean工厂实例化 配置管理对象读取bean定义 据定义创建 初始化bean对象 放入ioc容器 生命周期尊重生命 热爱生活
上图 虽然一张图胜过千言万语 但是我画的也不是图 死板的流程图罢了
启动流程 作用域
单例singleton每个容器一个bean实例beanFactory维护
prototype原型每次请求都注入新的实例
requesthttp请求创建一个单例对象
session每个session中有个bean实例
applicationservletContext生命周期中复用单例对象
websocket定义在websocket生命周期的
global全局
设计模式低耦合两个字yyds
工厂beanFactory/factoryBean
适配器advisorAdapter
访问者propertyAccessor
装饰器beanWrapper
代理aop
观察者事件监听
策略instantiationStrategy
模板jdbcTemplate
委派beanDefinitionParseDefenate
责任链beanPostProcessor
aop这块嘎嘎厉害
CGLIB通过创建目标类的子类来代理原始对象并在子类中添加增强处理 代理类class文件加载 修改字节码生成子类 jdk基于接口 proxy类 被代理对象注入到中间对象
中间对象实现invocationHandler接口(拦截器 反射 代理接口匿名类)
newProxyInstance利用中间对象来生产代理对象
事务
数据库事务和aop机制
Transactional注解bean创建代理对象作为bean
调用代理对象方法先判断方法上是否加了Transactional注解 如果咱就说如果加了 利用事务管理器 创建数据库连接 autocommitfalse
spring事务传播机制是spring自己实现的基于数据库连接做的 一个数据库连接一个事务这句话挺重要的新开一个事务 先建连接再执行sql 事务创建/提交/回滚通过transactionInterceptor切面完成据事务管理器和属性自动管理
platformTransactionManager实现 dataSourceTransactionManagerjdbc和mybatis的 jtaTransctionManager分布式事务 xa接口 多资源事务管理 spring事务核心 transactionDefinition定义属性(隔离级别/传播行为/超时/只读)和transactionStatus(是否新事物/是否标记为回滚)
失效
私有方法 / 未被spring管理 /方法用final修饰/方法内部调用/未开启事务
传播属性
propagation_required 当前则没有新建有则加入默认
propagationrequiresnew 当前存在挂起 新建事务(和挂起的无关) 内抛异常外层捕获可不处理
propagation_supports支持当前事务无事务 非事务方式执行
propagation_mandatory支持当前事务 没有抛异常
propagationnotsupported以非事务方式操作 当前存在则挂起
propagation_never非事务方式执行存在事务抛异常
propagation_nested活动事务存在 运行一个嵌套事务中无required执行使用单独事务使用独立事务拥有多个回滚的保存点内部事务的回滚不会对外部事务造成影响只对datasourceTransactionManager事务管理器有效
循环依赖
三级缓存
lazy解决构造方法造成的循环依赖问题
一级缓存 初始化的单例对象 singletonObjects
二级earlySingletonObjects缓存保存new出来的不完整对象当单例池中找不到依赖的属性时先从二级缓存中获取不完整对象完成对象创建后续依赖注入中 单例池中对象引用关系调整完成
三级缓存singletonFactories引用对象配置了aop单例池中最终会需要注入动态代理对象(对象初始化之后才开始)非原对象保存所有对象的动态代理配置信息发现有循环依赖时 获取代理对象 提前aop
后置处理器 beanFactory后置处理器BeanFactoryPostProcessorspring启动先创建beanFactory实例 实例化所有bean后 依赖注入前后置处理器加工beanFactoryspring扫描基于beanFactory实现 bean后置处理器BeanPostProcessor先实例对象bean后置处理器对该对象加工依赖注入给autowired自动赋值aop基于原实例对象进行动态代理生成代理对象