提纲:

🔥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,事务是一个典