Spring学习笔记(IOC、AOP)
之前通过网上资源和博客,记录一下Spring的内容
IOC(Inversion of Control):控制翻转
Spring Core 最核心的部分
需要最先了解依赖注入(Dependency Inversion)
所谓的依赖注入:就是把底层类作为参数传递给上层类,实现上层对下层的“控制”
IOC的另一个实现方式是DL(依赖查找),这是一个相较于DI而言更为主动的方法,在需要的时候调用框架所提供的方法来获取对象,需要提供配置文件信息,但是这个需要用户自己去使用API查找资源,有侵入性。
依赖注入方式
Setter
Interface
Constructor
Annotation
IOC容器的优势:
避免在各处出现使用new来创建类,可以做到统一维护
创建实例时,不需要了解其中的细节
IOC是从上往下去查找依赖关系,到达最底层的时候,再反过来一步一步往上去new实例对象。
在我们重新编写一个底层有几百个依赖关系的API的时候,我们不需要去了解他底层是怎么样的,因为IOC Container的特性要求编写每个Class的时候都需要相应的config文件,只要在需要使用的地方注入这个service就可以了,这样就提高了项目的可维护性,降低了开发难度。
Spring IOC支持的功能
依赖注入
依赖检查
自动装配
支持集合
指定初始化方法和销毁方法
支持回调方法
Spring IOC容器的核心接口
BeanFactory
ApplicationContext
**BeanDefinition:**主要用来描述Bean的定义,在spring启动的时候会将xml或者注解里的Bean解析成BeanDefinition
**BeanDefinitionRegistry:**提供向IOC容器注册BeanDefinition对象的方法
**BeanFactory:**Spring框架最核心的接口,提供了IOC的配置机制,包含Bean的各种定义,便于实例化Bean,建立Bean之间的依赖关系,Bean生命周期的控制
ApplicationContext的功能(集成多个接口)
BeanFactory:能够管理、装配Bean
ResourcePatternResolver:能够加载资源文件
MessageSource:能够实现国际化等功能
ApplicationEventPublisher:能够注册监听器,实现监听机制
Springboot中**@Compent就是代表这个类要扫描装配进IOC中,那么在启动类中@CompentScan就会去扫描装配的Bean,不过在启动类中的@SpringBootApplication**已经存在了这个功能,所以不需要再单独写一次。
@Autowired会找到对应的Bean
getBean方法的代码逻辑
转换beanName -> 从缓存中加载实例 -> 实例化Bean -> 检测parentBeanFactory -> 初始化依赖的Bean -> 创建Bean
Spring Bean的5个作用域
**singleton:**Spring的默认作用域,容器里拥有唯一的Bean实例。适合无状态的Bean
**prototype:**针对每个getBean请求,容器都会创建一个Bean实例。适合有状态的Bean,这个需要三思,频繁创建是要有开销的。
对于web容器则支持另外三种
**request:**会为每个Http请求创建一个Bean实例
**session:**为每个session创建一个Bean实例
**globalSession:**会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效
销毁过程:
如果实现了DisposableBean接口,则会调用destroy方法
如果配置了destry-method属性,则会调用其配置的销毁方法
AOP(面向切面编程)
关注点分离:不同的问题交给不同的部分去解决
面向切面变成AOP正式此种技术的体现
通用化功能代码的实现,对应的就是所谓的切面(Aspect)
业务功能代码和切面代码分开后,架构将变得高内聚低耦合
确保功能的完整性:切面最终需要被合并到业务中(Weave)
例如使用方向:日志、性能、安全、事务、异常等
AOP的三种织入方式
**编译时:**需要特殊的Java编译器,如AspectJ
**类加载时:**需要特殊的Java编译器,如AspectJ和AspectWerkz
**运行时:**Spring采用的方式,通过动态代理的方式,实现简单
AOP的主要名词概念
**Aspect:**通用功能的代码实现
**Target:**被织入Aspect的对象
**Join Point:**可以作为切入点的机会,所有方法都可以作为切入点
**Pointcut:**Aspect 实际被应用在的Join Point,支持正则
**Advice:**类里的方法以及这个方法如何织入到目标方法的方式
**Weaving:**Aop的实现过程
Advice的种类
前置同事(Before)
后置通知(AfterReturing)
异常通知(AfterThrowing)
最终通知(After)
环绕通知(Around)
**AOP的实现:**jdkProxy和Cglib
由AopProxyFactory根据AdvisedSupport对象的配置来决定
默认策略如果目标类是接口,则用jdkProxy来实现,否则用后者
JDKProxy的核心:InvocationHandler接口和Proxy类,通过Java的内部反射机制实现(反射机制在生成类的过程中比较高效)
Cglib:以继承的方式动态生成目标类的代理,借助ASM实现(ASM在生成类之后的执行过程中毕竟高效)
Spring里的代理模式的实现
模式:接口+真实实现类+代理类
真实实现类的逻辑包含在getBean方法里
getBean方法返回的实际上是Proxy的实例
Proxy实例是Spring采用JDK Proxy或cglib动态生成的