spring是什么?

  • spring是一个框架,是一个容器,更是一个生态。它是一个开源的框架,为企业的开发而生,能够简化开发,提高效率。Spring的核心是AOP和IoC,运用这两种编程思想去管理项目的生命周期。

AOP是什么?

  • AOP是spring的核心之一,叫做面向切面编程,是一种编程思想。AOP能降低我们业务代码的耦合,提高复用。利用它能把业务中重复的部分提取出来封装成模块,称之为切面,注入到我们的目标对象中去。它能在不修改业务逻辑的前提下对我们代码进行增强。AOP有两种代理方式:JDK代理,运行时创建接口代理实例;cglib代理,运行时创建子类代理实例。AOP使用的主要场景是日志和权限。

AOP的基本概念

  1. aspect 切面  通常是一个类,里面可以定义切入点和通知
  2. joinpoint 连接点 执行过程中明确的点,一般是方法的调用
  3. pointcut 切入点  带通知的连接点,通常是切入点表达式
  4. advice 通知 增强方法

5种通知增强方法:

  1. Before 前置通知
  2. After 后置通知(不管有没有异常)
  3. AfterReturning 返回通知
  4. AfterThrowing 异常通知
  5. Around 环绕通知

IoC是什么

  • IoC是spring的核心之一,叫做控制反转,是一种编程思想。spring通过注解或者xml的方式,将类交给spring控制。spring将类转化为beandefinition对象,交由beanfactory去实现。bean的生命周期由spring去管理。  

Spring执行流程

  1. 执行web.xml中的ContextLoaderListener监听器
  2. 初始化ContextLoaderListener中的ContextInitialized方法
  3. ContextInitialized方法会调用父类ContextLoader的InitwebapplicationContext方法
  4. InitwebapplicationContext执行了以下任务:创建WebApplication容器,初始化需要的Bean,加载配置文件

spring和springboot的区别

本质:springboot的本质就是spring,能帮我们完成一些配置。springboot不提供spring的核心功能,只是作为spring的“脚手架”。springboot“习惯优于配置”能让项目很快启动起来。

优点:自动配置,提供主流框架的配置集成,不用依赖servlet容器运行,提供项目监控

核心功能:自动配置 针对spring项目,springboot提供了很多自动配置

                  起步依赖 提供起步依赖给项目的依赖管理提供帮助

                  项目监控 能够检测运行的项目

bean的生命周期(bean从创建到销毁的过程中spring都做了什么?)

  1. 处理别名,检查缓存
  1. 三级缓存       
  1. singletonObjects是一级缓存,放单例成本对象
  2. singletonFactories是三级缓存,放单例工厂
  3. earlySingletonObject是二级缓存,放单例工厂的产品,可称为提前单例对象
  1. 检查父容器,依赖顺序
  2. 按scope来创建bean(五个scope:singleton,prototype,request,session,application)
  1. scope可理解为从xxx范围内寻找这个bean
  2. singleton scope表示从单例池中寻找这个bean,若没有则创建放入单例池
  3. prototype scope表示从不缓存bean,每次都创建新的
  4. request scope表示从request对象范围内获取bean,若无则创建放进request中(session,application同)
  1. 创建bean实例
  1. 创建bean实例
  1. AutowiredAnnotationBeanPostProcessor选择构造        优先选择带@Autowired注解的构造方法,若有唯一的有参构造方法也会入选
  2. 默认的无参构造方法       若上面后处理器没能找到合适的构造方法,就采用默认构造方法,即使是私有的
  1. 依赖注入
  1. 注解匹配  识别@Autowired,@Value,@Resource
  2. byname  set方法中的名字
  3. bytype
  4. 精确指定
  1. 初始化
  1. 处理aware接口
  2. 执行初始化
  1. 识别@Poststruct注解 
  2. 通过InitializingBean接口回调执行初始化 
  3. <bean int-method>或@Bean(initmethod)
  1. 执行aop代理
  1. 注解可销毁接口    判断可销毁bean
  1. 类型转换  如果getbean方法的requestType参数和实际得到的参数不同就会进行类型转换
  2. 销毁bean
  1. 单例bean的销毁在application close时会找到可销毁bean进行销毁
  2. prototypebean要手动销毁
  3. 自定义域bean的销毁在作用域对象生命周期结束时