Spring
1.什么是Spring框架,有什么特点?包括什么模块?介绍下两大核心思想?
- Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。
- 特点:
- 支持 IoC(Inversion of Control:控制反转)、AOP(Aspect-Oriented Programming:面向切面编程)、可以很方便地对数据库进行访问对单元测试支持比较好、可以很方便地集成第三方组件(电子邮件,任务,调度,缓存等等)
- 包括模块:
- Core Container:Spring 框架的核心模块,也可以说是基础模块,主要提供 IoC 依赖注入功能的支持。
- AOP:提供了面向切面的编程实现。
- Spring Web:对 Web 功能的实现提供一些最基础的支持。
- Spring Test:提供一些单元测试和集成测试框架。
- 两大核心思想:
- 1.依赖注入(IOC):是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,在其他语言中也有应用。
- 2.AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。
2.什么是Spring Bean?Bean的生命周期?
- Bean 代指的就是那些被 IoC 容器所管理的对象。
- 生命周期:
- 1.创建 Bean 的实例:Bean 容器首先会找到配置文件中的 Bean 定义,然后使用 Java 反射 API 来创建 Bean 的实例。
- 2.Bean的属性设置:通过依赖注入(DI)的方式为 Bean 设置相关属性,例如@Autowired 等注解注入的对象、@Value 注入的值、注入的各种资源。
- 3.Bean 初始化:在属性设置完成后,容器会调用Bean的初始化方法。
- 4.销毁Bean:销毁并不是说要立马把 Bean 给销毁掉,而是把 Bean 的销毁方法先记录下来,将来需要销毁 Bean 或者销毁容器的时候,就调用这些方法去释放 Bean 所持有的资源。
3.Spring、Spring MVC、Spring Boot、Spring Cloud的区别?
- Spring:Spring 包含了多个功能模块,其中最重要的是 Spring-Core(主要提供 IoC 依赖注入功能的支持) 模块, Spring 中的其他模块(比如 Spring MVC)的功能实现基本都需要依赖于该模块。
- Spring MVC:Spring MVC 是 Spring 中的一个很重要的模块,主要赋予 Spring 快速构建 MVC 架构的 Web 程序的能力。MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。
- Spring Boot:Spring Boot是Spring框架的一个子项目,旨在简化基于Spring的应用程序的开发和部署。Spring Boot还集成了许多常用的第三方库和技术 ,使得开发者可以更容易地构建复杂的应用程序.
- Spring Cloud : Spring Cloud是一个用于构建分布式系统的微服务框架,Spring Cloud基于Spring Boot构建,可以很好地与Spring Boot应用程序集成,帮助开发者构建和管理大规模的微服务架构。
4.Spring底层是怎样完成自动装配的?Spring Application和BeanFactory?
- Spring底层完成自动装配的过程主要依赖于BeanFactory和ApplicationContext两个核心接口,以及依赖注入(DI)机制。
- BeanFactory是Spring框架中的最底层的接口,它是Spring IoC容器的基础。
- Spring Application是Spring框架中的顶级接口,它代表了一个Spring应用程序的上下文。
5.Spring循环依赖怎么解决的?为什么要用三级缓存解决呢?@Lazy能解决循环依赖嘛?👍
- Spring的循环依赖是指两个或多个Bean之间相互依赖,形成了一个闭环的依赖关系。换句话说,Bean A依赖于Bean B,同时Bean B也依赖于Bean A,这样就形成了循环依赖。
- Spring解决循环依赖的主要方式是使用三级缓存机制。当Spring容器在创建Bean的过程中发现循环依赖时,它会将正在创建的Bean暴露出来,以便其他Bean能够提前引用。
- 1.单例Bean的缓存: Spring容器会首先尝试从单例Bean的缓存中获取Bean实例。
- 2.提前暴露的Bean的缓存: 如果单例Bean的缓存中没有找到Bean实例,Spring容器会尝试将正在创建的Bean暴露出来,即在Bean的实例化之前,将Bean的ObjectFactory暴露出来。
- 3.早期Bean的缓存: 当其他Bean引用了正在创建但尚未初始化完成的Bean时,Spring容器会将该Bean放入早期Bean的缓存中。
- 为什么?
- 因为在Bean初始化的过程中,如果发现循环依赖,如果没有合适的机制来解决,就会陷入死循环或者抛出异常的情况。通过使用三级缓存,Spring能够在初始化过程中提前暴露Bean实例,从而解决循环依赖问题。
- @Lazy:
- @Lazy注解是Spring提供的一种懒加载机制,用于延迟初始化Bean。虽然@Lazy可以延迟初始化Bean,但它并不能解决循环依赖问题。循环依赖问题通常发生在Bean初始化的过程中,而@Lazy注解只是延迟了Bean的初始化,对解决循环依赖并没有帮助。
6.Spring事务是什么?怎么实现的?隔离级别?传播机制?事务失效?
- 事务:
- 事务是逻辑上的一组操作,要么都执行,要么都不执行。
- 如何实现:
- 在Spring配置文件中或者使用注解配置事务管理器,指定事务管理器的类型。
- 隔离级别:
- 1.READ-UNCOMMITTED(读取未提交) :最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
- 2.READ-COMMITTED(读取已提交) :允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
- 3.REPEATABLE-READ(可重复读) :对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
- 4.SERIALIZABLE(可串行化) :最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
- 传播机制:
- 1.REQUIRED(默认):果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- 2.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- 3.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于REQUIRED
- 4.MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)
- 事务失效:
7.Spring常见的注解有哪些?注入Bean的注解有哪些?
- 注入Bean的:
- @Autowired: 自动装配注解,标注在字段、构造函数、Setter方法上,Spring会自动将匹配的Bean注入进来。
- @Resource: 与@Autowired类似,可以用于自动注入Bean,但更加灵活,可以根据名称或者类型进行注入。
- @Inject:
- 常见注解:
- @Service: 标注在服务层(Service)类上,表示该类提供业务逻辑处理,通常与业务逻辑层的Bean关联。
- @Controller: 标注在控制器(Controller)类上,表示该类用于处理HTTP请求,通常与Web层的Bean关联。
- @Repository: 标注在DAO(数据访问对象)类上,表示该类用于数据库访问,通常与持久化层的Bean关联。
- @Component: 标注在类上,表示该类是一个组件,会被Spring自动扫描并注册为Bean。
8.Spring框架中都用到了哪些设计模式?结合项目中用过哪些?
- 1.工厂设计模式:Spring 使用工厂模式可以通过 BeanFactory 或 ApplicationContext 创建 bean 对象。
- BeanFactory:延迟注入(使用到某个 bean 的时候才会注入),相比于ApplicationContext 来说会占用更少的内存,程序启动速度更快。
- ApplicationContext:容器启动的时候,不管你用没用到,一次性创建所有 bean
-
- 单例设计模式 :Spring 中 bean 的默认作用域就是 singleton(单例)的。
- 3.代理设计模式 : Spring AOP 功能的实现。
- 4.模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
- 5.观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
- 6.适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。
9.Spring中Bean的作用域有哪些?
- singleton(单例) : IoC 容器中只有唯一的 bean 实例。Spring 中的 bean 默认都是单例的,是对单例设计模式的应用。
- prototype (原型): 每次获取都会创建一个新的 bean 实例。也就是说,连续 getBean() 两次,得到的是不同的 Bean 实例。
- request (请求)(仅 Web 应用可用): 每一次 HTTP 请求都会产生一个新的 bean(请求 bean),该 bean 仅在当前 HTTP request 内有效。
- session (会话)(仅 Web 应用可用) : 每一次来自新 session 的 HTTP 请求都会产生一个新的 bean(会话 bean),该 bean 仅在当前 HTTP session 内有效。
- application (应用)(仅 Web 应用可用):每个 Web 应用在启动时创建一个 Bean(应用 Bean),该 bean 仅在当前应用启动时间内有效。
- websocket (仅 Web 应用可用):每一次 WebSocket 会话产生一个新的 bean。
10.拦截器和过滤器了解吗?
- 过滤器:过滤器(Filter)是Servlet规范中的组件,用于对请求和响应进行通用的处理,作用范围更广
- 拦截器:拦截器(Interceptor)是Spring框架提供的一种拦截器机制,主要用于对处理器执行链进行拦截和增强,作用范围更局限。
11.Spring动态代理默认用哪一种?
在Spring中,动态代理默认使用基于Java接口的JDK动态代理。JDK动态代理是通过接口来实现代理的,它要求被代理的类必须实现一个或多个接口。AOP就是基于动态代理的。
12.Spring如何将类加载进容器中?
- 组件扫描: Spring自动扫描指定包及其子包中的类,并将标注了特定注解(如@Component、@Service、@Repository、@Controller等)的类加载进容器中。
- 显式配置: 开发者可以通过XML配置文件、Java配置类或者使用@Bean注解的方法手动配置Bean定义,将指定的类加载进容器中。
13.AOP可以用来解决什么问题?为什么用AOP来做公共字段赋值?👍
14.AOP和反射的原理,框架怎么实现的?
- AOP:AOP通过动态代理在运行时将切面织入到目标方法或类中,实现对横切关注点的动态增强。常见的AOP框架包括Spring AOP、AspectJ等。
- 反射:反射通过Java提供的反射API在运行时检查和修改类、方法、属性等结构,实现动态加载类、创建对象、调用方法等功能。常见的反射框架包括Apache Commons BeanUtils、Spring的BeanWrapper等。
- 框架通过利用动态代理和反射技术,实现了对AOP和反射的支持和应用。
15.Spring的事务注解?使用的注意事项?
- @Transactional:作用范围
- 1.方法:推荐将注解使用于方法上,不过需要注意的是:该注解只能应用到 public 方法上,否则不生效。
- 2.类:如果这个注解使用在类上的话,表明该注解对该类中所有的 public 方法都生效。
- 3.接口:不推荐在接口上使用。
- 使用Spring的事务注解时需要注意事务的传播行为、隔离级别、异常处理、事务范围和性能影响等方面。
Spring Boot
16.SpringBoot的优点?运行原理和启动流程,如何使用?👍
- 优点:
- 1.简化配置: Spring Boot提供了自动化的配置和默认值,大大简化了项目的配置工作,使得开发者可以更专注于业务逻辑的实现而不是繁琐的配置。
- 2.快速启动: Spring Boot内嵌了Tomcat、Jetty等Web容器,可以快速启动和部署应用程序,极大地提高了开发和部署效率。
- 3.集成丰富: Spring Boot集成了大量常用的开发框架和技术,如Spring Data、Spring Security、Thymeleaf等,开发者可以方便地集成这些组件来实现各种功能。
- 4.微服务支持: Spring Boot天然支持微服务架构,可以快速开发和部署独立的微服务应用,并且提供了丰富的监控和管理功能。
- 5.生态丰富: Spring Boot拥有庞大的社区和丰富的生态系统,提供了大量的插件和扩展,可以满足不同场景下的需求。
- 运行原理和启动流程:👍
- Spring Boot应用程序的运行原理是基于嵌入式的Servlet容器(如Tomcat、Jetty)和自动化的配置。在启动时,Spring Boot会扫描并加载应用程序中的所有配置和组件,自动配置各种必要的功能(如数据源、Web服务器、安全等),然后启动嵌入式的Servlet容器,并将应用程序部署到该容器中,最终启动应用程序。
- 如何使用?
- 1.建Spring Boot项目:可以使用Spring Initializr网站(https://start.spring.io/)或者在IDE中使用Spring Boot Initializr插件创建Spring Boot项目。
- 2.编写业务代码:编写业务逻辑代码、控制器、服务等。
- 3.配置应用程序:根据需求配置应用程序的属性、数据源、Web服务器等。
- 4.运行应用程序:在IDE中直接运行应用程序,或者使用Maven或Gradle构建应用程序,并在命令行中运行。
17.什么是Spring Boot Starter?怎么自定义?
18.SpringBoot启动类注解的功能?介绍一下@SpringBootApplication注解?
@SpringBootApplication是Spring Boot应用程序的核心注解,具有组合其他注解(包含了多个其他注解,包括@Configuration、@EnableAutoConfiguration和@ComponentScan。)、开启自动配置、启用组件扫描、自动装配和标识应用程序入口等功能。
19.linux怎么部署SpringBoot项目?
20.SpringBoot自动配置原理是如何实现的?👍
Spring Boot的自动配置原理是通过@EnableAutoConfiguration注解实现的。它会在应用启动时自动扫描类路径下的META-INF/spring.factories文件,加载其中定义的自动配置类,并根据这些类的条件判断决定是否需要应用对应的自动配置。这样可以大大简化项目的配置工作,提高开发效率。
21.SpringBoot的开箱即用怎么实现的?
22.SpringBoot的开箱即用怎么实现的?
- 1.Tomcat: Tomcat是最常用的Java Web服务器之一,Spring Boot默认使用Tomcat作为嵌入式Web容器。
- 2.Jetty: Jetty是另一个流行的Java Web服务器,也被Spring Boot支持作为嵌入式Web容器。
- 3.Undertow: Undertow是一个高性能的Java Web服务器,Spring Boot也支持使用Undertow作为嵌入式Web容器。