一、面向对象的工程与对象
面向对象的软件设计,是由对象组成(对象的定义、依赖关系的确定),而且对象之间彼此合作来完成某个功能。
没有引入IOC之前由设计者自行管理对象,IOC的引入将对象的创建、依赖关系的管理和生命周期的控制从应用程序代码中解耦出来。
二、IOC容器的设计
IOC容器的核心设计那一定是依赖注入,依赖注入是基于反射实现的。
Spring IOC容器存储使用的数据结构是Bean,类似于Object是无法重复的。
IOC的设计主要是封装的思想。
三、Bean
1.Bean与Spring容器之间的关系
用四个过程去表达这种关系:
第一步,容器去读取Bean的配置信息。也就是Bean定义的属性,那么它最为常见的呢,就是通过autowired的这样的注解定义的引用或者说依赖关系。那么最终呢,在容器中会被包装成Beandefinition。
第二步,有了Bean的定义以后,可以根据定义中所描述的这个Bean应该有的样子去实例化这个Bean,也就是容器会将注册表中的所有并去完成实例化。
第三步和第二步是同一个过程中的两个步骤。完成实例化的Bean,它会被放入到IOC容器里面。这个Bean就会常驻在IOC容器,直到容器关闭或者是并被清理掉。在IOC容器中,Bean所在的数据结构也叫做Bean缓存池,是有一个map去维护的。
第四步,业务功能想要使用Bean的时候,就去告诉IOC容器说我需要去使用这个Bean。那么IOC容器就完成提供或者说注入。
2.Bean的生命周期
实例化,也就是“new”。
属性填充(依赖),用户属性、容器属性赋值。
初始化,前置方法与后置方法。
销毁。
3.Bean的循环依赖问题
使用三级缓存(通过三个Map)解决循环依赖:
第一个Map<String,Object>缓存已经实例化初始注入的Bean对象。第二个Map<String,Object>缓存实例化后但还未进行属性注入的Bean,用于提前显示Bean已存在于IOC容器中。第三个Map<String,ObjectFactory>用于生成原始对象进行AOP操作后的代理对象。
4.Bean的分类操作
深入理解BeanPostProcessor:在Bean执行初始化的前后进行。解析Bean自定义注解,针对注解做一些前置处理,并归类Bean聚合处理。对Bean分析处理,记录时间和检查等。
四、AOP
1.AOP的执行时机:
在Service层的前后执行。
将分散在各个业务逻辑代码中的相同代码通过横向切割的方法抽取到独立模块中。这样在进行coding的过程中只需要关注业务逻辑,而不用担心与业务逻辑无关的代码。
2.AOP的核心概念
Aspect:声明切面类,交由Spring管理,也是一种Spring Bean。
Joint Point:明确定义的点,异常处理等。
Point Cut:连接点的集合。
Weaving:把切面连接到其他的应用,并创建一个被通知的对象。
Target:目标对象,AOP对Target起到作用。
Advice:选择一种确定的通知类型。