-
spring核心:IoC控制反转、AOP切面编程、声明式事务管理(声明式:只写意图/规则,细节交给框架。框架实现细节:开发者写注解 → 容器启动时扫描 → 通过 AOP / 动态代理 / 字节码增强 生成代理对象 → 拦截方法调用 → 注入框架逻辑)
-
控制反转:
- new到容器管理:把对象的管理权“反转”给spring容器(被 Spring 接管的对象就叫 Bean)
- Spring容器的启动过程:启动容器 -> 加载配置文件/扫描注解 -> 解析Bean定义(@ComponentScan、@Service、@Bean、@Configuration等)-> 实例化Bean(反射调用构造方法)-> 属性填充(@Autowired注入依赖)—> 初始化(@PostConstruct、InitializingBean接口)—> 放入容器(单例池)-> 使用 -> 销毁(@PreDestroy、DisposableBean接口)
- Bean的作用域:Singleton(每个容器只有一个实例,适用于无状态Bean)、Prototype(每次获取都创建新实例,适用于有状态Bean)、Request(每次Http请求)、Session(每次Http会话)、application(整个应用生命周期)、websocket(每一个会话是一个bean)
- FactoryBean工厂与Bean:spring容器不是直接创建Bean,是通过工厂方法获取。注册到容器的是工厂,实际拿到的是getObject()返回的对象.
- AOP切面编程
- 静态代理和动态代理:静态代理是手动编写代理类(手动写代理类,每个接口都要写一个代理类,导致代码膨胀),动态代理是通过反射生成代理类(运行时生成代理类)。
- JDK动态代理:被代理的类必须实现InvocationHandler接口,重写invoke方法,通过Proxy.newProxyInstance()生成代理对象。
- CGLIB动态代理:通过继承目标类,重写方法,通过Enhancer.create()生成代理对象(劣势:无法代理 final、private 方法(不能被重写))
- Spring AOP:通过@Aspect注解定义切面,@Pointcut定义切点,@Before、@After、@Around等定义通知。
- Spring AOP的实现原理:(判断代理的类是否实现接口)优先通过动态代理生成代理对象,在代理对象中织入通知。
- Spring AOP的织入方式:编译时织入(AspectJ编译器)、类加载时织入(AspectJ加载时织入)、运行时织入(Spring AOP)。
- @Transactional原理:方法被@Transactional注解修饰 -> Spring在创建这个Bean时,发现有@Transactional注解 -> 生成一个代理对象Proxy,覆盖原方法 -> 调用 createOrder 时(检查是否有事务 -> 创建事务 -> 运行方法 -> 提交事务 -> 返回结果)-> 真实对象serviceImpl,但拿到的是代理对象。
- 事务管理
- 事务传播行为:REQUIRED(默认传播行为,如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务)、REQUIRES_NEW(创建一个新的事务,如果当前存在事务,则把当前事务挂起)、NESTED(如果当前存在事务,则创建一个嵌套事务;如果当前没有事务,则创建一个新的事务)、SUPPORTS(如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行)、NOT_SUPPORTED(以非事务方式执行操作,如果当前存在事务,则把当前事务挂起)、MANDATORY(如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常)、NEVER(以非事务方式执行,如果当前存在事务,则抛出异常)
- 事务隔离级别:DEFAULT(使用数据库默认的隔离级别)、READ_COMMITTED(允许读取未提交的数据)、REPEATABLE_READ(允许读取已提交的数据)、SERIALIZABLE(允许串行化读取数据)
- 事务回滚规则: 默认情况下,spring只对RuntimeException和Error进行回滚,对checked Exception不回滚。
- 事务超时和只读:超过时间后自动回滚,只读事务,可以进行优化
- 事务失效的常见场景:自调用问题(无法走代理)、非public方法、异常被捕获、错误的异常类型、代理对象问题(直接new对象而不是从容器获取,即非Bean对象)
- spring事件机制:观察者模式(事件发布、事件监听器、ApplicationListener接口实现)、自定义事件(实现ApplicationEvent接口)内置事件(ContextRefreshedEvent容器刷新完成、ContextStartedEvent容器启动、ContextStoppedEvent容器停止、ContextClosedEvent容器关闭、Http请求处理完成)
- Spring循环依赖:三级缓存解决循环依赖
- Spring启动与自动配置
- Enable模块化原理:
@EnableXxx引入了一个@Import(XxxConfiguration.class),该 Configuration 往容器注册了相关的 Bean 后置处理器。 - @Conditional: 条件注册,Spring Boot 的自动配置大量使用
@Conditional,根据类路径判断是否启用某个功能。如:@ConditionalOnClass(RedisTemplate.class) // 存在 RedisTemplate 类才注册