# spring-learning **Repository Path**: liuxingtian/spring-learning ## Basic Information - **Project Name**: spring-learning - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-03-06 - **Last Updated**: 2021-08-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Spring 是分层的全栈轻量级开源框架,以 IOC 和 AOP 为内核,提供了展示层 Spring MVC 和业务层事务管理等众多企业级应用技术,还能整合第三方框架和类库,是使用最多的 JAVA EE 企业级开源框架。 ## IOC 和 AOP IOC、AOP 不是 Spring 提出的,只不过之前更加偏向理论化,在技术层面 Spring 做了非常好的实现。 ### IOC **什么是 IOC ?** IOC 全称 Inversion of Control(控制反转),这是一个技术思想,不是技术实践。 描述的是对象的创建、管理。 在传统开发中:一个类调用另一个类,往往需要在当前类中 new 一个对象; IOC 思想下:不需要自己 new 对象,使用 IOC 容器,帮助实例化、管理对象,需要使用时通过 IOC 容器获取; 此时我们无需考虑如何创建对象,也不需要考虑对象的创建、管理。 控制:对象创建(实例化)的权利; 反转:控制器交给外部 Spring IOC 框架,IOC 维护对象依赖关系; 图2 **IOC 解决了什么问题?** 解决对象之间的耦合问题, 图3 **IOC 和 DI** DI:Dependency Injection (依赖注入),IOC 和 DI 都描述了对象创建和关系维护,IOC 站在对象角度,对象实例化、管理的权利交给容器,DI 站在容器的角度,对象使用时,容器会把依赖的其它对象注入; ### AOP **什么是 AOP?** AOP:Aspect Oriented Programming(面向切面编程),是 OOP 的延续,OOP包含封装、继承、多态三大特性,OOP 是一种垂直继承体系,OOP 思想可以解决大多数代码重复性问题,但是有一些处理不了,在顶级父类中出现了代码重复(图6); 在多个顺序流程中,出现的相同子流程代码称为横切逻辑代码,这些子流程称为点,多个流程称为面,横切逻辑的使用很有限,比如在事务、日志、权限校验。图7 横切逻辑的问题:横切代码逻辑重复、横切代码和主题业务无关,混杂在一起代码不好维护; AOP 独辟蹊径,提出横向抽取机制,将横切逻辑代码和业务逻辑代码分离 **AOP 解决什么问题?** 在不改变原有代码逻辑的前提下,增强横向逻辑代码,从根本上解耦合。 **为什么叫面向切面编程?** 切:原有逻辑不能动,只能操作横切逻辑代码,所以面向横切逻辑; 面:横切逻辑代码往往要影响很多方法,每个方法如同一个点,多个点构成面; ### 手写 IOC、AOP ## Spring 使用 ### Bean 实例化 set方法、构造器注入 ### 三种使用方式 纯XML 注解+XML: 第三方的jar定义在xml,自己定义的写在注解中 开启注解: 引入JDBC配置: @Component、@Controller、@Service、@Repository @Autowired 按照类型注入,如果一个接口有多个实现,可以结合@Qualifier("id") 纯注解: @Configuration @ComponentScan component-scan @PropertySource property-placeholder 引入配置文件 @Value 读取配置文件属性 @Import 关联多个类 @Bean bean ### 高级使用 **bean 延迟加载(使用时创建):** Spring IOC 默认在服务启动时实例化所有 singleton bean xml:lazy-init="true" 或者 beans 的default-lazy-init @Lazy 不常用的对象可以延迟加载 可以查看 ApplicationContext的BeanFactory singletonObjects 数据 **FactoryBean 和 BeanFactory:** BeanFactory是容器的顶级接口,定义了接口行为,负责生产、管理Bean; Spring 的Bean 有两种:普通Bean、工厂Bean 我们可以借助FactoryBean自定义Bean的创建过程,类比Bean创建的静态方法、实例方法; 经常用于整合其他框架; **后置处理器:** BeanPostProcessor:bean对象实例化之后 BeanFactoryPostProcessor:bean实例化前,BeanFactory实例化后 SpringBean生命周期: 读取xml、反射实例化、设置属性值、调用BeanNameAware的setBeanName、调用BeanFactoryAware的setBeanFactory方法、调用ApplicationContextAware的setApplicationContext、 调用BeanPostProcessor的预初始化方法(两个方法postProcessBeforeInitialization、postProcessAfterInitialization)、调用InitialzingBean的afterPropertiesSet方法 、调用init-method方法、 如果是prototype立即交付,如果是singleton放入缓存池 销毁时调用DisposableBean的destory和destory-method方法 读取xml涉及到BeanDefinition封装xml bean标签信息 英语Aware:发现 ## Spring IOC 源码 原则:抓主线、关注源码解构和业务流程,淡化某一行编写细节 技巧:断点(调用栈)、反调(Find Usage) 编译:core、oxm、 context、beans、aspects、aop等等 工程-》tasks-》compilerTestJava **BeanFactory创建流程:** ApplicationContext 是容器的高级接口,BeanFactory是顶级容器,官方称为IOC容器(map IOC容器的单例池,容器是一组组件和过程的集合,不仅仅是单例池), ApplicationContext实现: AutowireCapableBeanFactory: HierarchicalBeanFactory:父容器 ListableBeanFactory:新增批量操作接口 MessageSource:国际化 ResourceLoader:加载资源(xml、properties等等) IOC容器创建管理Bean,Bean有生命周期, 无参构造器、初始化方法、Bean后置处理器的before/after:AbstractApplicationContext 的 finishBeanFactoryInitialization Bean工厂后置处理器:AbstractApplicationContext 的 invokeBeanFactoryPostProcessors Bean的后置处理器:AbstractApplicationContext 的 registerBeanPostProcessors **BeanDefinition加载、解析注册流程:** **Bean创建流程:** **延迟加载流程:** **Spring IOC 循环依赖问题处理:**