spring是什么?
- spring是一个框架,是一个容器,更是一个生态。它是一个开源的框架,为企业的开发而生,能够简化开发,提高效率。Spring的核心是AOP和IoC,运用这两种编程思想去管理项目的生命周期。
AOP是什么?
- AOP是spring的核心之一,叫做面向切面编程,是一种编程思想。AOP能降低我们业务代码的耦合,提高复用。利用它能把业务中重复的部分提取出来封装成模块,称之为切面,注入到我们的目标对象中去。它能在不修改业务逻辑的前提下对我们代码进行增强。AOP有两种代理方式:JDK代理,运行时创建接口代理实例;cglib代理,运行时创建子类代理实例。AOP使用的主要场景是日志和权限。
AOP的基本概念
- aspect 切面 通常是一个类,里面可以定义切入点和通知
- joinpoint 连接点 执行过程中明确的点,一般是方法的调用
- pointcut 切入点 带通知的连接点,通常是切入点表达式
- advice 通知 增强方法
5种通知增强方法:
- Before 前置通知
- After 后置通知(不管有没有异常)
- AfterReturning 返回通知
- AfterThrowing 异常通知
- Around 环绕通知
IoC是什么
- IoC是spring的核心之一,叫做控制反转,是一种编程思想。spring通过注解或者xml的方式,将类交给spring控制。spring将类转化为beandefinition对象,交由beanfactory去实现。bean的生命周期由spring去管理。
Spring执行流程
- 执行web.xml中的ContextLoaderListener监听器
- 初始化ContextLoaderListener中的ContextInitialized方法
- ContextInitialized方法会调用父类ContextLoader的InitwebapplicationContext方法
- InitwebapplicationContext执行了以下任务:创建WebApplication容器,初始化需要的Bean,加载配置文件
spring和springboot的区别
本质:springboot的本质就是spring,能帮我们完成一些配置。springboot不提供spring的核心功能,只是作为spring的“脚手架”。springboot“习惯优于配置”能让项目很快启动起来。
优点:自动配置,提供主流框架的配置集成,不用依赖servlet容器运行,提供项目监控
核心功能:自动配置 针对spring项目,springboot提供了很多自动配置
起步依赖 提供起步依赖给项目的依赖管理提供帮助
项目监控 能够检测运行的项目
bean的生命周期(bean从创建到销毁的过程中spring都做了什么?)
- 处理别名,检查缓存
- 三级缓存
- singletonObjects是一级缓存,放单例成本对象
- singletonFactories是三级缓存,放单例工厂
- earlySingletonObject是二级缓存,放单例工厂的产品,可称为提前单例对象
- 三级缓存
- 检查父容器,依赖顺序
- 按scope来创建bean(五个scope:singleton,prototype,request,session,application)
- scope可理解为从xxx范围内寻找这个bean
- singleton scope表示从单例池中寻找这个bean,若没有则创建放入单例池
- prototype scope表示从不缓存bean,每次都创建新的
- request scope表示从request对象范围内获取bean,若无则创建放进request中(session,application同)
- 创建bean实例
- 创建bean实例
- AutowiredAnnotationBeanPostProcessor选择构造 优先选择带@Autowired注解的构造方法,若有唯一的有参构造方法也会入选
- 默认的无参构造方法 若上面后处理器没能找到合适的构造方法,就采用默认构造方法,即使是私有的
- 依赖注入
- 注解匹配 识别@Autowired,@Value,@Resource
- byname set方法中的名字
- bytype
- 精确指定
- 初始化
- 处理aware接口
- 执行初始化
- 识别@Poststruct注解
- 通过InitializingBean接口回调执行初始化
- <bean int-method>或@Bean(initmethod)
- 执行aop代理
- 注解可销毁接口 判断可销毁bean
- 创建bean实例
- 类型转换 如果getbean方法的requestType参数和实际得到的参数不同就会进行类型转换
- 销毁bean
- 单例bean的销毁在application close时会找到可销毁bean进行销毁
- prototypebean要手动销毁
- 自定义域bean的销毁在作用域对象生命周期结束时