IOC AND AOP

98 阅读4分钟
  • Spring
  • ssh -> ssm >spring全家桶
  • Spring发展历程
  • EJB(IBM)->Rod Johnson(spring)Spring5.2.2
  • 优势:解耦、AOP切面、声明式事务、方便测试、集成框架、降低JAVAEE API使用难度
  • 核心思想
  • IOC
  • inversion of control(控制反转),是一个技术思想,不是实现
  • 帮我们实例化对象并且管理
  • 解决了对象之间的耦合问题
  • Ioc和DI的区别
  • DI:依赖注入 (站在容器的角度)
  • AOP
  • OOP:封装继承多态
  • AOP是OOP的拓展
  • 面向切面,在不改变原有业务逻辑,横切解耦逻辑代码,避免代码重复
  • 手写IOC和AOP问题分析
  • new关键字耦合问题:
  • 1.除了new关键字实例化对象,还有(反射)可以实现
  • Class.forName(全限定名)
  • 可以把全限定名配置在xml中
  • 2.使用工厂模式通过反射生产对象,工厂模式是解耦比较好的方式
  • 单例模式
  • 懒汉式和饿汉式
  • 首先都有一个私有构造函数
  • 有一个私有静态变量
  • 1.懒汉式
  • 私有构造和私有变量,静态工厂方法getInstance获取实例化对象
  • 有线程安全问题要加synchronized关键字
  • 2.饿汉式
  • 私有构造,直接实例化的私有静态变量,getInstance直接返回已经实例化的对象
  • BeanFactory
  • 1.Map成员变量存储对象
  • 2.静态块解析Xml,通过反射实例化对象存入map
  • 3.提供工厂方法通过id获取Bean
  • 事务问题:
  • Service层没有事务控制
  • 原因:使用了不同的数据库连接,解决方案让连接跟当前线程绑定,每次都获取同一个线程
  • 用ThreadLocal存储连接,没有从连接池取,有直接从threadlocal取(单例模式)
  • 动态代理来生成业务的代理对象,处理异常控制事务
  • Spring容器方式
  • 1.XmL模式
  • BeanFactory是springIOC容器的顶级接口。ApplacationContext是子接口、
  • Web应用在web.xml配置contextloaderlistener监听器
  • 2.xml结合注解模式
  • 第三方Jar用xml,自己定义的用注解
  • xml配置注解扫描
  • <context:component-scan base-package="">
  • @Auotwired注解
  • 按照类型注入,如果容器无法唯一锁定对象可以加@Qualifier("xxx")指定具体的Id
  • @Resource注解按照名称注入(不推荐使用,jdk11已经移除)
  • SpringBean的生命周期
  • 1.实例化bean(如通过反射)
  • 2.设置属性值
  • 3.调用BeanNameAware的setBeanName
  • 4.调用BeanFactoryAware的setbeanfactory方法
  • 5.调用ApplicationContextAware的setApplicationContext
  • 6.调用beanpostProcessor的预初始化方法
  • 7.调用initializiingbean的afterprorertiesSet方法
  • 8.调用定制的初始化方法init-method
  • 9.调用Beanpostprocessor的后初始化方法
  • 10.单例还会调用destorymethod
  • BeanDefinition封装配置信息
  • 源码分析
  • 1.定焦原则:抓主线
  • 2.宏观原则:不抠细节,站在上帝视角,关注结构和流程
  • 技巧:
  • 1.断点
  • 2.反调(Find usages)
  • 3.经验(Spring中doxxx)
  • 安装Gradle构建spring工程
  • 编译流程
  • core-oxm-context-beans-aspects-aop
  • Task-other-complleTest.java
  • 循环依赖问题:
  • 只能解决set方式
  • 三级缓存机制
  • 1.单例池,2.early。3.singletonFactorys
  • A对象实例化之后提前放入三级缓存(提前暴露自己)
  • B对象创建时发现依赖A,去三级缓存使用A,升级到二级缓存
  • B创建完成之后放入单例池
  • A继续创建时使用单例池中的B
  • Spring声明式事务
  • 事务四大特性
  • 1.原子性
  • 指事务是一个不可分割的工作单位,要么都成功,要么都不成功
  • 2.一致性
  • 从数据的角度来说的,数据一致
  • 3.隔离性
  • 多个并发事务之间要隔离
  • 4.持久性
  • 事务被提交,数据永久生效
  • 事务的隔离级别
  • 脏读:一个线程读到另外一个线程中未提交的数据
  • 不可重复读:一个线程中的事务读到另一个线程中已经提交update的数据
  • 幻读:读到另一个线程Insert或者delete的数据
  • 四种隔离级别
  • 串行(最高)
  • 可重复读:避免脏读、不可重复读
  • 读已提交:避免脏读
  • 读未提交:最低
  • 默认是可重复读:会对行枷锁
  • 事务传播行为
  • 如果A调用B,且都添加了事务
  • PROPAGATION_REQUIRED:如果当前没有事务,新建一个事务,如果有加入
  • PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就不用事务
  • AOP通过后置处理器完成代理对象的创建