依赖注入(Dependence Injection);
含义:把底层类作为参数传递给上层类,实现上层对下层的“控制”。
IOC、 DI、 DL的关系:
IOC容器的优势
答:避免在各处使用new来创建类, 并且可以做到统一维护
创建实例的时候不需要了解其中的细节
Spring IOC支持的功能
依赖注入
依赖检查
自动装配
支持集合
指定初始化方法和销毁方法
支持回调方法
BeanDefinition
主要用来描述Bean的定义
BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法
BeanFactory: Spring框架最核心的接口
提供IOC的配置机制
包含Bean的各种定义,便于实例化Bean
建立Bean之间的依赖关系
Bean生命周期的控制
BeanFactory与ApplicationContext的比较
BeanFactory 是Spring框架的基础设施,面向Spring
ApplicationContext 面向使用Spring框架的开发者。
ApplicationContext的功能(继承多个接口)
BeanFactory: 能够管理,装配Bean
ResourcePatternResolver:能够加载资源文件
MessgeSource:能够实现国际化等功能
ApplicationEventPublisher:能够注册监听器,实现监听机制
refresh方法:
为IOC容器以及Bean的生命周期管理提供条件
刷新Spring上下文信息,定义Spring上下文加载流程
getBean方法的代码逻辑
转换beanName
从缓存中加载实例
实例化Bean
检测parentBeanFactory
初始化依赖的Bean
创建Bean
Spring Bean的作用域
Singleton: Spring的默认作用域,容器里拥有唯一的Bean实列
Prototype:针对每个getBean请求,容器都会创建一个Bean实列
Request: 会为每个Http请求创建一个Bean实列
Session: 会为每个Session创建一个Bean实例
globalSession: 会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效
Spring Bean的生命周期:
销毁过程:
若实现了DisposableBean接口,则会调用destroy方法
若配置了destroy-method属性,则会调用其配置的销毁方法
AOP的三种织入方式:
编译时织入:需要特殊的Java编译器,如AspectJ
类加载时织入:需要特殊的java编译器,如AspectJ和AspectWerkz
运行时织入:Spring采用的方式,通过动态代理的方式,实现简单
AOP的主要名词概念
Aspect:通用功能的代码实现
Target: 被织入Aspect的对象
Join Point:可以作为切入点的机会,所有方法都可以作为切入点
Pointcut: Aspect实际被应用在的Join Poin, 支持正则
Advice: 类里的方法以及这个方法如何织入到目标方法的方式
Weaving: Aop的实现过程
Advice的种类
前置通知(before)
后置通过(AfterReturning)
异常通知(AfterThrowing)
最终通知(After)
环绕通知(Around)
AOP的实现:JdkProxy和Cglib
由AopProxyFactory根据AdvisedSupport对象的配置来决定
默认策略如果目标类是接口,则用JDKProxy来实现,否则使用后者
JDKProxy的核心:InvocationHandler接口和Proxy类
Cglib:以继承的方式动态生成目标类的代理
JDKProxy: 通过Java的内部放射机制实现
Cglib: 借助ASM实现
发射机制在生成类的过程中比较高效
ASM在生成类之后的执行过程中比较高效
Spring里的代理模式的实现
真实实现类的逻辑包含了getBean方法里
getBean方法返回的实际上是Proxy的实例
Proxy实例是Spring采用JDK Proxy或CGLIB动态生成的