框架知识考点
SpringIOC的应用
Spring IOC支持的功能
- 依赖注入
- 依赖检查
- 自动装配
- 支持集合
- 指定初始化方法和销毁方法
- 支持回调方法
SpringIOC的核心接口
- BeanFactory:Spring框架最核心的接口,相当于汽车发动机;
- 提供IOC的配置机制;
- 包含Bean的各种定义,便于实例化Bean;
- 建立Bean之间的依赖关系;
- Bean生命周期的控制
- ApplicationContext,相当于包含发动机在内的轮胎,底盘等构成车的基本组件
- 继承BeanFactory:能够管理、装配Bean
- ResourcePatternResolver:能够加载资源文件
- MessageSource:能够实现国际化等功能;
- ApplicationContext:能够注册监听器,实现监听机制;
BeanFactory与ApplicationContext的比较
- BeanFactory是Spring框架的基础设施,面向Spring;
- AppcationContext是面向Spring框架的开发者;(设施比较完全)
BeanDefinition
- 主要用来描述Bean的定义
BeanDefinitionRegistry
提供向IOC容器注册BeanDefinition对象的方法;
getBean方法的代码逻辑
- 转换beanName;
- 从缓存中加载实例;
- 实例化Bean;
- 检测parentBeanFactory;
- 初始化依赖的Bean;
- 创建Bean;
Spring Bean的作用域
- singleton: Spring的默认作用域,容器里拥有唯一的Bean实例;
- prototype: 针对每个Bean的请求,容器都会创建一个Bean实例;
- request: 针对每一个request请求,都会创建一个Bean实例;
- session: 会为每个session创建一个Bean实例;
- globalSession: 会为每个全局Http Session创建一个Bean实例,该作用域仅对Portlet有效;
Spring Bean的生命周期
创建过程
1、实例化一个Bean--也就是我们常说的new;
2、按照Spring上下文对实例化的Bean进行配置--也就是IOC注入;
3、如果这个Bean已经实现了BeanNameAware接口,会调用它实现的setBeanName(String)方法,此处传递的就是Spring配置文件中Bean的id值
4、如果这个Bean已经实现了BeanFactoryAware接口,会调用它实现的setBeanFactory(setBeanFactory(BeanFactory)传递的是Spring工厂自身(可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以);
5、如果这个Bean已经实现了ApplicationContextAware接口,会调用setApplicationContext(ApplicationContext)方法,传入Spring上下文(同样这个方式也可以实现步骤4的内容,但比4更好,因为ApplicationContext是BeanFactory的子接口,有更多的实现方法);
说下我对3、4、5的理解:
直接对照图的话是对照图里第二步的内容:第二步的目的其实就是为了丰富初始化bean对象的内容,BeanNameAware,BeanFactoryAware,ApplicationContextAware这三个接口其实分别传递了BeanID数据、BeanFactory和ApplicationContext这两个容器对象
6、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessBeforeInitialization(Object obj, String s)方法,BeanPostProcessor经常被用作是Bean内容的更改,并且由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
7、如果Bean在Spring配置文件中配置了init-method
属性会自动调用其配置的初始化方法。
8、如果这个Bean关联了BeanPostProcessor接口,将会调用postProcessAfterInitialization(Object obj, String s)方法、;
注:以上工作完成以后就可以应用这个Bean了,那这个Bean是一个Singleton的,所以一般情况下我们调用同一个id的Bean会是在内容地址相同的实例,当然在Spring配置文件中也可以配置非Singleton,这里我们不做赘述。
销毁过程
- 若实现了DisposableBean接口,则会调用destroy方法;
- 若配置了destroy-method属性,则会调用其配置的销毁方法;
具体理解:
- 当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
- 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
Spring AOP
AOP的三种织入方式
- 编译时织入: 需要特殊的Java编译器,如AspectJ;
- 类加载织入:需要特殊的Java编译器,如AspectJ和AspectWerkz;
- 运行时织入:Spring采用的方式,通过动态代理的方式,实现简单;
AOP的主要名词概念
- Aspect:通用功能的代码实现;
- Target:被织入Aspect的对象(被aop的);
- Join Point:可以作为切入点的机会,所有方法都可以作为切入点;
- PointCut:切入点,Aspect实际被应用在的Join Point,支持正则;
- Advice:通知,类里的方法以及这个方法如何织入到目标方法的方式(方法执行之前,执行时候、执行之后?)
- Weaving:AOP的实现过程;
Advice
- 前置通知
- 后置通知
- 异常通知
- 最终通知
- 环绕溶质
AOP的具体实现:JdkProxy和Cglib
- 由AopProxyFactory根据AdvisedSupport对象的配置来决定;
- 默认策略如果目标类是接口,则用JDKProxy来实现,否则用后者;
- JDKProxy的核心:
InvocationHandler
接口和Porxy
类,通过Java的内部反射机制来实现; - Cglib:以继承的方式动态生成目标类的代理,借助ASM来实现;
代理模式
接口+真实实现类+代理类
Spring里的代理模式的实现
- 真实实现类的逻辑包含在了getBean方法里;
- getBean方法返回的实际上是Proxy的实例;
- Proxy实例是Spring采用JDK Proxy或者CGlib动态生成的;
Spring、SpringMVC、SpringBoot、SpringCloud有什么区别和联系
- Spring
- Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架;
- SpringMVC
- SpringMVC是Spring的一个模块、一个Web框架。通过DispatcherServlet、ModelAndView和ViewResolver,开发web应用变得容易。主要针对的是网站应用程序或者服务开发——URL路由、Session、模板引擎、静态web资源等;
- SpringBoot
- Spring配置复杂、繁琐,所以推出了Springboot,约定大于配置简化了Spring配置流程;
- SpringCloud
- SpringCloud是构建于SpringBoot之上的,重点关注全局的服务治理框架;
总结:
- Spring是核心,提供基础功能;
- SpringMVC是基于Spring的一个MVC框架;
- SpringBoot是为简化Spring配置的快速开发整合包;
- SpringCloud是构建在SpringBoot之上的服务治理框架;