spring的优缺点
- IOC集中管理对象,对象之间解耦,方便维护对象
- AOP在不修改原代码的情况下,实现一些拦截
- 提供众多辅助类,方便开发
- 方便集成各种优秀框架
紧耦合和松耦合
松耦合可以使用单一职责原则、接口分离原则、依赖倒置原则
IOC
**概念:**依赖控制反转,在IOC之前,一个对象要引入另一个对象就要自己new,用完之后也要自己释放,对象之间耦合较深,出现IOC之后,由spring来控制对象注入,引用对象只需要用就可以了,不需要再管理注入对象的生命周期。
**DI:**依赖注入。运行时依赖 IoC 容器来动态注入对象所需要的外部依赖。通过反射实现的。
**IOC的实现原理:**通过工厂模式和反射机制,
1、配置文件解析。容器通过读取XML、注解或JavaConfig等配置文件来获取应用程序的相关信息,这些配置文件定义了对象及其之间的依赖关系。
2、创建BeanDefinition。容器读取配置文件后,会根据其中的信息创建BeanDefinition对象,这是IOC的核心数据结构,封装了Bean的定义信息,如类名、属性、依赖关系等。
3、实例化Bean。容器使用反射机制根据BeanDefinition对象中的信息实例化Bean对象,并注入依赖的其他Bean对象。
4、Bean生命周期管理。在实例化Bean对象之后,IOC容器还要对Bean的生命周期进行管理,包括调用初始化方法和销毁方法等。
5、依赖注入。IOC容器的核心功能之一是依赖注入,即动态地将依赖关系注入到组件之中,这也是降低代码耦合度的重要手段。
AOP
面向切面,多个对象的公共逻辑抽取。在内存中生成一个aop对象,包含原对象的所有方法,并在切点执行完成后调用原对象的方法。
连接点(Join point):指程序运行过程中所执行的方法。
切面(Aspect):被抽取出来的公共模块
切点(Pointcut):切点用于定义 要对哪些Join point进行拦截。
通知 advice:before after around AfterReturning AfterThrowing
织入(Weaving):通过动态代理,在目标对象(Target)的方法(即连接点Join point)中执行增强逻辑(Advice)的过程。
Spring容器的启动流程
实例化Spring容器,注册BeanDefination,调用refresh刷新容器。
1、初始化Spring容器,注册内置的BeanPostProcessor的BeanDefinition到容器中
2、将配置类的BeanDefinition注册到容器中
3、调用refresh()方法刷新容器
BeanFactory和ApplicationContext有什么区别?
BeanFactory是Spring里面最底层的接口,是IoC的核心,定义了IoC的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理。ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外
Spring Bean的生命周期
Spring Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate --> 初始化 Initialization --> 销毁 Destruction
Spring中bean的作用域
(1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。
(2)prototype:为每一个bean请求创建一个实例。
(3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。
(4)session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。
(5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。
BeanFactory的作用
1、是Spring中非常核心的一个顶层接口
2、实现了简单工厂模式,通过getBean来获取
3、有非常多的实现类,最强大的工厂是DefaultListableBeanFactory。Spring底层就是使用的该实现工厂进行生产Bean的
4、BeanFactory也是容器,管理Bean的生命周期
BeanFactory和ApplicationContext的区别
ApplicationContext实现了FactoryBean,他不负责生产,只负责通知BeanFactory去生产Bean,在此基础上,还做了
1、注册bean,如果只用FactoryBean,还需要注册才能生产,ApplicationContext帮我们做了注册
2、加载环境变量
3、实现时间监听
4、支持多语言
5、注册很多对外扩展点
循环依赖如何被解决
只能解决通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。
三级缓存
7种传播事务,没被考过,随便写写了解一下
REQUIRED(默认的
如果当前方法的执行上下文中已经打开了事务,那么就使用当前这个事务。
如果当前没有事务,就创建一个新的。
REQUIRES_NEW
声明 REQUIRES_NEW 的话就会创建一个新的物理事务,内层事务的提交回滚都是独立于外层事务的。外层事务不受内层事务结果的影响,他们运行于独立的物理事务。
NESTED
NESTED 使嵌套的事务使用相同的物理事务,但是对嵌套调用设置了保存点,所以 inner 事务可以独立于 outer 事务回滚。
SUPPORTS
支持事务,如果当前存在事务,就沿用当前事务,如果不存在,则继续采用无事务的方式运行。
MANDATORY
必须使用事务。如果当前没有事务,则会抛出异常,如果存在当前事务,就沿用当前事务。
NOT_SUPPORTED
不支持事务,当前存在事务时,将挂起事务,运行方法。
NEVER
不支持事务,如果当前方法存在事务,则抛出异常,否则继续使用无事务机制运行。