当前位置: 首页 > news >正文

Spring 面经

1、Spring 是什么?特性?有哪些模块?

Spring 是一个轻量级、非入侵式的控制反转 (IoC) 和面向切面 (AOP) 的框架。

1.1 Spring 有哪些特性呢?

在这里插入图片描述

  1. IoC 和 DI 的支持:Spring 的核心就是一个大的工厂容器,可以维护所有对象的创建和依赖关系,Spring 工厂用于生成 Bean,并且管理 Bean 的生命周期,实现高内聚低耦合的设计理念。
  2. AOP 编程的支持:Spring 提供了面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等切面功能。
  3. 声明式事务的支持:支持通过配置就来完成对事务的管理,而不需要通过硬编码的方式,以前重复的一些事务提交、回滚的 JDBC 代码,都可以不用自己写了。
  4. 快捷测试的支持:Spring 对 Junit 提供支持,可以通过注解快捷地测试 Spring 程序。
  5. 快速集成功能:方便集成各种优秀框架,Spring 不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持。
  6. 复杂 API 模板封装:Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等)都提供了模板化的封装,这些封装 API 的提供使得应用难度大大降低。

1.2 简单说一下什么是AOP 和 IoC?

AOP:面向切面编程,是一种编程范式,它的主要作用是将那些与核心业务逻辑无关,但是对多个对象产生影响的公共行为封装起来,如日志记录、性能统计、事务等。

IoC:控制反转,是一种设计思想,它的主要作用是将对象的创建和对象之间的调用过程交给 Spring 容器来管理。

2、Spring 有哪些模块呢?

Spring 框架是分模块存在,除了最核心的 Spring Core Container 是必要模块之外,其他模块都是可选,大约有 20 多个模块。最主要的七大模块:

  1. Spring Core:Spring 核心,它是框架最基础的部分,提供 IoC 和依赖注入 DI 特性。
  2. Spring Context:Spring 上下文容器,它是 BeanFactory 功能加强的一个子接口。
  3. Spring Web:它提供 Web 应用开发的支持。
  4. Spring MVC:它针对 Web 应用中 MVC 思想的实现。
  5. Spring DAO:提供对 JDBC 抽象层,简化了 JDBC 编码,同时,编码更具有健壮性。
  6. Spring ORM:它支持用于流行的 ORM 框架的整合,比如:Spring + Hibernate、Spring + iBatis、Spring + JDO 的整合等。
  7. Spring AOP:即面向切面编程,它提供了与 AOP 兼容的编程实现。

3、Spring 有哪些常用注解呢?

Spring 提供了大量注解简化 Java 应用的开发和配置,主要用于 Web 开发、往容器注入 Bean、AOP、事务控制等。
在这里插入图片描述

3.1 Web 开发方面有哪些注解呢?

  1. @Controller:用于标注控制层组件。
  2. @RestController:是 @Controller 和 @ResponseBody 的结合体,返回 JSON 数据时使用。
  3. @RequestMapping:用于映射请求 URL 到具体的方法上,还可以细分为:
    @PostMapping:只能用于处理 POST 请求
    @DeleteMapping:只能用于处理 DELETE 请求
    @PutMapping:只能用于处理 PUT 请求
    @GetMapping:只能用于处理 GET 请求
  4. @ResponseBody:直接将返回的数据放入 HTTP 响应正文中,一般用于返回 JSON 数据。
  5. @RequestBody:表示一个方法参数应该绑定到 Web 请求体。
  6. @PathVariable:用于接收路径参数,比如 @RequestMapping(“/hello/{name}”),name 就是路径参数。
  7. @RequestParam:用于接收请求参数。比如 @RequestParam(name = “key”) String key,key 就是请求参数。

3.2 容器类注解有哪些呢?

  1. @Component:标识一个类为 Spring 组件,使其能够被 Spring 容器自动扫描和管理。
  2. @Controller:标识一个控制器组件(控制层)。
  3. @Service:标识一个业务逻辑组件(服务层)。
  4. @Repository:标识一个数据访问组件(持久层)。
  5. @Autowired:按类型自动注入依赖。
  6. @Resource:按名称自动注入依赖。
  7. @Configuration:用于定义配置类,可替换 XML 配置文件。
  8. @Value:用于将 Spring Boot 中 application.properties 配置的属性值赋值给变量。

3.3 AOP 方面有哪些注解呢?

@Aspect 用于声明一个切面,可以配合其他注解一起使用,比如:
@After:在方法执行之后执行。
@Before:在方法执行之前执行。
@Around:方法前后均执行。
@PointCut:定义切点,指定需要拦截的方法。

3.4 事务注解有哪些?

主要就是 @Transactional,用于声明一个方法需要事务支持。

4、Spring 中应用了哪些设计模式呢?

在这里插入图片描述

  1. 工厂模式:BeanFactory 和 ApplicationContext,实现 Bean 的创建和管理。
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
MyBean myBean = context.getBean(MyBean.class);
  1. 单例模式:这样可以保证 Bean 的唯一性,减少系统开销。
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyService myService1 = context.getBean(MyService.class);
MyService myService2 = context.getBean(MyService.class);

// This will print "true" because both references point to the same instance
System.out.println(myService1 == myService2);
  1. 代理模式:来实现 AOP 横切关注点(如事务管理、日志记录、权限控制等)
@Transactional
public void myTransactionalMethod() {
    // 方法实现
}

4.1 Spring如何实现单例模式?

Spring 通过 IOC 容器实现单例模式,具体步骤是:单例 Bean 在容器初始化时创建并使用 DefaultSingletonBeanRegistry 提供的 singletonObjects 进行缓存。在请求 Bean 时,Spring 会先从缓存中获取。

// 单例缓存
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<>();

public Object getSingleton(String beanName) {
    return this.singletonObjects.get(beanName);
}

protected void addSingleton(String beanName, Object singletonObject) {
    this.singletonObjects.put(beanName, singletonObject);
}

5、Spring 容器、Web 容器之间的区别?

Spring 容器是 Spring 框架的核心部分,负责管理应用程序中的对象生命周期和依赖注入。

Web 容器(也称 Servlet 容器),是用于运行 Java Web 应用程序的服务器环境,支持 Servlet、JSP 等 Web 组件。常见的 Web 容器包括 Apache Tomcat、Jetty等。

Spring MVC 是 Spring 框架的一部分,专门用于处理 Web 请求,基于 MVC(Model-View-Controller)设计模式。

6、说一说什么是 IoC、DI?

所谓的 IoC,就是由容器来控制对象的生命周期和对象之间的关系。控制对象生命周期的不再是引用它的对象,而是容器,这就叫控制反转(Inversion of Control)。于是,对于某个对象来说,以前是它控制它依赖的对象,现在是所有对象都被 Spring 控制。IOC 是一种思想,DI 是实现 IOC 的具体方式,比如说利用注入机制(如构造器注入、Setter 注入)将依赖传递给目标对象。

6.1 为什么要使用 IoC 呢?

在平时的 Java 开发中,如果我们要实现某一个功能,可能至少需要两个以上的对象来协助完成,在没有 Spring 之前,每个对象在需要它的合作对象时,需要自己 new 一个,比如说 A 要使用 B,A 就对 B 产生了依赖,也就是 A 和 B 之间存在了一种耦合关系。有了 Spring 之后,就不一样了,创建 B 的工作交给了 Spring 来完成,Spring 创建好了 B 对象后就放到容器中,A 告诉 Spring 我需要 B,Spring 就从容器中取出 B 交给 A 来使用。这就是 IoC 的好处,它降低了对象之间的耦合度,使得程序更加灵活,更加易于维护。

7、说说 BeanFactory 和 ApplicantContext?

BeanFactory 位于整个 Spring IoC 容器的顶端,ApplicationContext 算是 BeanFactory 的子接口。最主要的方法就是 getBean(),这个方法负责从容器中返回特定名称或者类型的 Bean 实例。ApplicationContext 继承了 HierachicalBeanFactory 和 ListableBeanFactory 接口,是 BeanFactory 的自动挡版本,是 Spring 应用的默认方式。
在这里插入图片描述

8、你知道 Spring 容器启动阶段会干什么吗?

Spring 的 IoC 容器工作的过程可以划分为两个阶段:容器启动阶段和 Bean 实例化阶段。其中容器启动阶段主要做的工作是加载和解析配置文件,保存到对应的 Bean 定义中。
在这里插入图片描述

8.1 说说 Spring 的 Bean 实例化方式

  1. 构造方法的方式:在类上使用 @Component(或@Service、@Repository 等特定于场景的注解)标注类,然后通过构造方法注入依赖。
@Component
public class ExampleBean {
    private DependencyBean dependency;

    @Autowired
    public ExampleBean(DependencyBean dependency) {
        this.dependency = dependency;
    }
}
  1. 静态工厂的方式:在这种方式中,Bean 是由一个静态方法创建的,而不是直接通过构造方法。
public class ClientService {
    private static ClientService clientService = new ClientService();

    private ClientService() {}

    public static ClientService createInstance() {
        return clientService;
    }
}
  1. 实例工厂方法的方式:与静态工厂方法相比,实例工厂方法依赖于某个类的实例来创建 Bean。这通常用在需要通过工厂对象的非静态方法来创建 Bean 的场景。
public class ServiceLocator {
    public ClientService createClientServiceInstance() {
        return new ClientService();
    }
}
  1. FactoryBean 接口的方式:FactoryBean 是一个特殊的 Bean 类型,可以在 Spring 容器中返回其他对象的实例。通过实现 FactoryBean 接口,可以自定义实例化逻辑,这对于构建复杂的初始化逻辑非常有用。
public class ToolFactoryBean implements FactoryBean<Tool> {
    private int factoryId;
    private int toolId;

    @Override
    public Tool getObject() throws Exception {
        return new Tool(toolId);
    }

    @Override
    public Class<?> getObjectType() {
        return Tool.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }

    // setter and getter methods for factoryId and toolId
}

9、你是怎么理解 Bean 的?

Bean 是指由 Spring 容器管理的对象,它的生命周期由容器控制,包括创建、初始化、使用和销毁。通过三种方式声明:注解方式、XML 配置、Java 配置。

  1. 使用 @Component、@Service、@Repository、@Controller 等注解定义,主流。
  2. 基于 XML 配置,Spring Boot 项目已经不怎么用了。
  3. 使用 Java 配置类创建 Bean:
@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

9.1 @Component 和 @Bean 的区别

@Component 是 Spring 提供的一个类级别注解,由 Spring 自动扫描并注册到 Spring 容器中。@Bean 是一个方法级别的注解,用于显式地声明一个 Bean,当我们需要第三方库或者无法使用 @Component 注解类时,可以使用 @Bean 来将其实例注册到容器中。

10、能说一下 Bean 的生命周期吗?

Bean 的生命周期大致分为五个阶段:
在这里插入图片描述

  1. 实例化:Spring 容器根据 Bean 的定义创建 Bean 的实例,相当于执行构造方法,也就是 new 一个对象。
  2. 属性赋值:相当于执行 setter 方法为字段赋值。
  3. 初始化:初始化阶段允许执行自定义的逻辑,比如设置某些必要的属性值、开启资源、执行预加载操作等,以确保 Bean 在使用之前是完全配置好的。
  4. 销毁:相当于执行 = null,释放资源。

11、为什么 IDEA 不推荐使用 @Autowired 注解注入 Bean?

这是因为字段注入的方式不能像构造方法那样使用 final 注入不可变对象。

11.1 @Autowired 和 @Resource 注解的区别?

@Autowired 是 Spring 提供的注解,按类型(byType)注入。
@Resource 是 Java EE 提供的注解,按名称(byName)注入。

12、Spring 有哪些自动装配的方式?

13、待更

14、

15、

16、

17、

18、

19、

20、

21、

22、

23、

24、

25、

26、

27、

28、

29、

30、

31、

32、

33、

34、

相关文章:

  • 生物化学笔记:医学免疫学原理11 免疫应答 + 固有免疫应答占位效应 + 适应性免疫应答 IgM和IgG抗体用于判断感染时期
  • 【C语言】深入理解指针(三):C语言中的高级指针应用
  • Linux centos 7 服务器组建与管理
  • 2025年 APP测试要点汇总!
  • docker存储卷及dockers容器源码部署httpd
  • Tomcat中的webapps的访问方式和java -jar内置Tomcat的访问方式的区别
  • 【MVP 和 MVVM 相比 MVC 有哪些优化点?】
  • 【MySQL篇】从零开始:解锁数据库的神秘面纱
  • 多光谱相机在农业中的应用(农作物长势、病虫害、耕地检测等)
  • 程序化广告行业(49/89):平台对接与用户识别技术全解析
  • 论文阅读笔记:Denoising Diffusion Implicit Models (3)
  • 2. ollama下载及安装deepseek模型
  • i18next在vue3中的应用,可参考写法或直接复用
  • Web数据挖掘及其在电子商务中的研究与应用
  • 如何跨越RAG中的语义鸿沟,实现高效精准的信息检索?
  • Vue Diff算法原理深度解析:如何高效更新虚拟DOM
  • 【QT】QT中的信号与槽
  • LabVIEW液压控制系统开发要点
  • 异步加载+内存分析
  • linux内核`fixmap`和`memblock`有什么不同?
  • 冒充现役军人、自称有中国兵工集团投资内幕,2人被刑拘
  • 港股上市首日大涨,宁德时代“新动力”何在?曾毓群详谈零碳科技布局
  • 新质观察|低空货运是城市发展低空经济的第一引擎
  • 新疆巴音郭楞州和硕县发生4.6级地震,震源深度10千米
  • 去年中企海外新增风电装机量5.4GW,亚太区域占比过半
  • 2025全球城市科技传播能力指数出炉,上海位列第六