1 spring
1.1 认识Spring
spring是什么
- spring是一个生态:可以构建一切基础设置
- spring是一个轻量级的开源容器框架,为了解决业务代码的耦合问题
- IOC:控制反转 AOP:面向切面编程 容器:管理对象的生命周期
spring的优缺点
优点: 解耦;ioc;aop;声明式事务;方便集成各种框架,简化Java EE Api的使用
集中管理对象,方便维护对象,不修改代码进行业务增强
缺点:spring框架大而全,使用门槛较高
Spring IOC
把对象的创建管理交给容器,而不是自己直接创建,维护
紧耦合和松耦合
紧耦合: 类之间高度依赖
松耦合:单一职责原则,接口分离原则,依赖导置原则
1.2 Spring Api
BeanFactory
工厂方法顶级接口,通过getBean获取Bean,也是Spring容器(管理Bean的生命周期)
BeanDefinition
负责存储Bean的定义信息,class,是否单例,是否懒加载等等bean的定义信息,后续根据bean的定义信息生产bean
Bean的图纸,决定怎么生产Bean
BeanFactory和ApplicationContext
ApplicationContext不生产Bean,而是通知BeanFactory去生产Bean
ApplicationContext做了更多的事情
- 自动注册Bean
- 加载环境变量
- 支持多语言
- 事件监听
- 注册对外扩展点
return this.getBeanFactory().getBean(name);
FactoryBean
一个特殊的Bean,由BeanFactory来生产以及管理的
他是一个接口,不能单独存在,必须被一个Bean去实现
通过getObject()方法返回对象,“狸猫换太子”,如果在他前面加一个&可以获得原本的实例,返回的对象变成懒加载
Spring IOC容器的加载过程
- 概念态: @Bean
- 定义态:BeanDefinetions
- 纯净态:class.newInstance
- 最终态:Object
- 创建一个ApplicationContext容器
- 调用invokeBeanFactoryPostProcesser,解析配置类,扫描class文件,注册成BeanDefinetion放到Map中
- 调用Bean工厂的后置处理器
- BeanFactory.getBean, 判断是否符合生产标准
- 实例化(反射)--纯静态
- 赋值属性--DI的实现
- 初始化 --aop,aware,生命周期的回调
- 放到Map(单例池)中
Spring IOC有哪些扩展点
- BeanDefinitionRegistryPostProcessor:动态注册BeanDefinetion,IOC加载注册Bean定义时机调用
- BeanFactoryPostProcessor:IOC加载注册Bean定义时机调用
- 在Bean的生命周期内会调用9次bean的后置处理器
- 初始化阶段,Aware接口,可以拿到对应的资源(BeanNameAware)
- 生命周期的回调:初始化,销毁
单例Bean的优势
spring 默认作用域
作用域: 单例,多例,request,session,application
- 减少新生成实例性能消耗,反射Or cglib性能消耗,内存分配的消耗
- 减少jvm垃圾回收对象
- 从缓存中获取比较快
Spring bean线程安全
单例bean存在线程安全问题
Spring实例化bean的方式
- 构造器方法(反射)
- 静态工厂方式(配置的factory-method)
- 实例化工厂(@Bean)
- FactoryBean方式