提纲:
🔥Spring
概念
容器
AOP
事务
🎈面试八股真题
1、什么是spring?
2、你们项目中为什么使用Spring框架?
3、谈谈你对Spring的AOP理解
4、Spring AOP和AspectJ AOP有什么区别?
5、在Spring AOP 中,关注点和横切关注的区别是什么?
6、什么是通知呢?有哪些类型呢?
7、说说你对Spring的IOC是怎么理解的? 8、Spring中@Controller、@Repository、@Service、@Component注解的作用详解
一、Spring
1. 概念
-
Spring 是一个以 IOC 和 AOP 为核心的容器框架,用于简化项目的开发
-
IOC:
-
反转控制,即将对象的生命周期完全交给 Spring 容器管理,包括对象的创建,对象间的依赖关系,对象的初始化和销毁等,从而减少组件间的耦合
-
-
AOP:
-
面向切面编程,Java 可以通过继承类或实现接口,定义类的纵向关系,纵向关系就是对一些对象或业务的共同点的抽取,但有些方法与具体的业务无关,比如日志记录,权限认证等,可以通过抽取成一个公共的模块(切面),通过 AOP 的方式对需要增强的方法(切点)进行增强,而不是在切点中直接调用这些公共方法,从而降低耦合,提高代码复用,方便维护
-
2.容器
-
BeanFactory:BeanFactory 是 Spring 体系中最底层的一个接口,是 IOC 的核心,定义了 IOC 的基本功能,包括 Bean 的定义、实例化、依赖注入、初始化等
-
ApplicationContext:继承自 BeanFactory,有 BeanFactory 的所有功能,并且进行了增强,比如事件广播与监听等
-
ApplicationContext 容器初始化步骤
-
调用 ApplicationContext 的 refresh 方法进行初始化,其中又调用了 12 个方法
-
1、prepareRefresh():进行初始化前的准备,包括加载 BeanFactory 后置处理器,以及加载 Properties 配置文件,以 K-V 形式存储在 Environment 中
-
2、obtainFreshBeanFactory():获取 BeanFactory 容器,加载以 xml 方式配置的 Bean 的创建信息加载为 BeanDefinition,并存储在 BeanDefinitionMap 中,在加载 Bean 时使用
-
3、prepareBeanFactory():为 BeanFactory 加载一些组件,包括 EL 表达式解析器等
-
4、postBeanFactoryProcessor():空实现,由子类进行增强
-
5、invokeBeanFactoryProcessor():调用 BeanFactory 后置工厂方法,例如调用 ConfigurationClass 后置处理器,解析 @Configuration、@Bean、@Import 等注解,对 BeanDefinitionMap 中的 Bean 定义进行补充
-
6、registerBeanPostProcessor():注册创建 Bean 所需要的 Bean 后置处理器,主要有 AutowireAnnotation、CommonAnnotation、AnnotationAwareAspectJ***Creator 等;
-
7、initMessageSource():初始化消息池组件,用于实现国际化
-
8、initApplicationEventMultiCaster():初始化事件广播器
-
9、onRefresh():空实现,由子类进行增强
-
10、registerListeners():注册事件监听器
-
11、finishBeanFactoryInitializing():加载所有非延迟 Bean 对象
-
12、finishRefresh():发布容器初始化完成事件,结束初始化
-
3.AOP
-
静态代理 AspectJ: 在编译阶段直接在类的字节码中织入通知,来生成代理类
-
动态代理:在程序运行时动态生成代理对象,对切点进行增强
-
JDK 动态代理:当目标对象实现了一个接口时,可以使用 JDK 动态代理,使用 Proxy 类的 newProxyInstance 方法获取代理对象,通过反射的方式获取目标对象的 ClassLoader 以及实现的接口,并通过 InvocationHandler 的 invoke方法调用切点方法并进行增强
-
Cglib 动态代理:当目标没有实现接口时,可以使用 Cglib 动态代理,通过继承父类的方式生成代理对象
-
4.事务
-
Spring 的事务本质上是数据库的事务,若数据库本身不支持事务,Spring 事务不会生效
-
编程式事务管理:通过调用底层 API 的 beginTransaction,commit,rollBack,手动的开启、提交和回滚事务,代码侵入严重,不方便维护
-
TransactionTemplate:Spring 提供的事务使用模板,使用 execute 方法,通过回调的方式实现方法的事务管理
-
声明式事务管理:基于 Spring AOP,事务是一个典