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

面试准备第一版ssm spring-springmvc

请写出spring中常用的依赖注入方法:

1、setter  

2、构造方法注入

3、字段注入

Setter 注入

  • 通过公共的 setter 方法进行依赖注入。
  • 优点:可选依赖,能更清晰地看到依赖关系。
  • 缺点:依赖在构造时不可用,可能导致使用时为空。

小案例:

spring-setter-injection-example
|-- src
|   |-- main
|   |   |-- java
|   |   |   |-- com
|   |   |   |   `-- example
|   |   |   |       |-- AppConfig.java
|   |   |   |       |-- UserController.java
|   |   |   |       |-- UserService.java
|   |   |       `-- Application.java
|   |   `-- resources
|   |       `-- application.properties
 

package com.example;

import org.springframework.stereotype.Component;

@Component
public class UserService {
    public void performUserOperation() {
        System.out.println("Performing user operation...");
    }
}

package com.example;

import org.springframework.stereotype.Component;

@Component
public class UserService {
    public void performUserOperation() {
        System.out.println("Performing user operation...");
    }
}
package com.example;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class UserController {
    private UserService userService;

    // Setter 方法进行依赖注入
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void handleRequest() {
        userService.performUserOperation();
    }
}

package com.example;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
}

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public UserService userService() {
        return new UserService(userRepository());
    }

    @Bean
    public UserRepository userRepository() {
        return new UserRepository();
    }
}





package com.example;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {
    public static void main(String[] args) {
        // 创建 Spring 上下文
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        
        // 获取 UserController bean
        UserController userController = context.getBean(UserController.class);
        
        // 处理请求
        userController.handleRequest(); // 调用方法,实际使用 UserService
    }
}
  • 本示例展示了如何使用 setter 方法进行依赖注入。
  • 通过 @Autowired 注解,Spring 自动注入 UserService 实例到 UserController 中。
  • 通过主应用类,我们创建了 Spring 上下文并运行了应用。

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainApplication {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        UserService userService = context.getBean(UserService.class);
        userService.performUserOperation();
    }
}

Spring 面试中,常被问到的注解包括以下几种,它们各自有不同的用途和功能

1. @Component
用途:标识一个 Spring 管理的组件。
场景:用于自动扫描并注册类为 Spring 上下文中的 bean。
2. @Service
用途:用于标识服务层的组件。
场景:通常与业务逻辑相关的类,便于组织和识别业务服务。
3. @Repository
用途:用于数据访问层的组件。
场景:表示一个持久化操作的类,支持异常转换。
4. @Controller
用途:标识一个 Spring MVC 控制器。
场景:用于处理 HTTP 请求并返回响应,通常与前端交互相关。
5. @Autowired
用途:用于自动注入依赖。
场景:可以用于构造函数、属性和方法中,Spring 会自动解析依赖。
6. @Value
用途:用于从配置文件中注入属性值。
场景:常用于将外部配置的值注入到 bean 中。
7. @Configuration
用途:标识一个类为 Spring 的配置类。
场景:用于定义 bean 和相关的依赖关系,替代 XML 配置。
8. @Bean
用途:用于在配置类中定义一个 Spring bean。
场景:标识一个方法的返回值为 Spring 管理的 bean。
9. @PostConstruct 和 @PreDestroy
用途:在 bean 初始化后和销毁前执行特定的方法。
场景:用于资源的初始化和清理。
10. @Transactional
用途:用于声明事务管理。
场景:通常用于服务层的方法,标识该方法的操作需要事务支持。
11. @RequestMapping
用途:用于映射 HTTP 请求到控制器的方法。
场景:用于定义请求的 URL、请求方法(GET、POST 等)。
12. @PathVariable 和 @RequestParam
用途:用于提取 URL 中的变量和请求参数。
场景:用于处理 RESTful 风格的请求。
总结
了解这些注解的用途、场景以及它们之间的关系,可以帮助你在面试中更好地回答相关问题。同时,结合实际项目中的使用经验,会让你的回答更具说服力。

使用场景:
代码说明
@Configuration:标识 AppConfig 类为 Spring 的配置类,表示它可以包含 bean 定义。

@Bean:在 userService() 和 userRepository() 方法上使用 @Bean 注解,表明这两个方法返回的对象是 Spring 管理的 bean。

依赖注入:在 userService() 方法中,调用 userRepository() 方法以获取 UserRepository 实例,从而实现了依赖注入。
 

@Autowired@Resource 都是用于依赖注入的注解,但它们之间有一些关键的区别。以下是它们的主要特点和区别:

1. @Autowired

  • 来源:是 Spring Framework 提供的注解。
  • 功能:自动注入 Spring 容器中的 Bean。默认情况下,Spring 会通过类型进行自动装配,如果有多个符合条件的 Bean,可以通过 @Qualifier 注解指定具体的 Bean。
  • 作用范围:可以用在构造函数、Setter 方法和字段上。
  • 必需性:默认情况下,@Autowired 注解的 Bean 是必需的。如果找不到匹配的 Bean,会抛出异常。可以通过 required = false 参数设置为可选。

@Resource

  • 来源:是 Java EE(Java Enterprise Edition)提供的注解,属于 JNDI(Java Naming and Directory Interface)。
  • 功能:根据名称进行注入,优先级高于类型。也可以通过 type 属性指定类型。
  • 作用范围:主要用于字段和 Setter 方法。
  • 必需性:如果指定的 Bean 名称不存在,通常会抛出异常,但行为可能会依赖于具体的实现和容器配置。

在 Spring MVC 中,有多种注解用于处理请求、定义控制器、处理依赖注入等。以下是一些常用的 Spring MVC 注解及其功能:

1、@Controller:标识一个类为控制器,处理请求和返回视图。

@Controller
public class UserController {
    // 处理请求的方法
}

@RestController:是 @Controller@ResponseBody 的组合,表示该控制器的每个方法都返回 JSON 或 XML 格式的响应。

@RestController
public class UserRestController {
    @GetMapping("/users")
    public List<User> getUsers() {
        // 返回用户列表
    }
}

@RequestMapping:用于映射 HTTP 请求到特定的方法或类上。可以指定请求的方法类型(GET、POST等)、URL路径等。

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getUsers() {
    // 返回用户列表
}

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> getUsers() {
    // 返回用户列表
}

@GetMapping@PostMapping@PutMapping@DeleteMapping:简化版的 @RequestMapping,用于分别处理不同类型的 HTTP 请求。

@GetMapping("/users")
public List<User> getUsers() {
    // 返回用户列表
}

@PostMapping("/users")
public void createUser(@RequestBody User user) {
    // 创建用户
}
@RequestParam:用于获取请求中的参数

@GetMapping("/users")
public User getUser(@RequestParam("id") Long id) {
    // 根据 id 获取用户
}
@GetMapping("/users/{id}")
public User getUser(@PathVariable("id") Long id) {
    // 根据 id 获取用户
}

@ResponseBody:表示方法返回的对象将自动序列化为 JSON 或 XML 格式,并写入 HTTP 响应体。
@GetMapping("/users")
@ResponseBody
public List<User> getUsers() {
    // 返回用户列表
}

GET 请求

  • 请求参数通常通过 URL 查询字符串传递。例如:/users?name=John&age=30

  • 可以使用 @RequestParam 注解获取查询参数。

  • @GetMapping("/users")
    public List<User> getUsers(@RequestParam String name) {
        // 根据名称获取用户
    }
     

POST 请求

  • 请求参数通常包含在请求体中,数据格式可以是 JSON、XML 或表单数据。

  • 可以使用 @RequestBody 注解将请求体中的数据映射到 Java 对象

  • @PostMapping("/users")
    public ResponseEntity<User> createUser(@RequestBody User user) {
        // 创建新用户
    }
    @RequestBody

  • @RequestBody 用于将请求体中的 JSON 数据映射到 Java 对象,通常用于处理创建和更新资源的 POST 和 PUT 请求。

控制层接收代码:

在 Postman 中发送一个包含 List 的 POST 请求非常简单。以下是详细步骤和示例:

步骤

  1. 打开 Postman:确保你已经安装并打开了 Postman。

  2. 创建新请求

    • 点击 “+” 创建一个新的请求选项卡。
  3. 选择请求方法

    • 在请求方法下拉菜单中选择 POST
  4. 输入 URL

    • 在 URL 输入框中输入你的 API 端点,例如 http://localhost:8080/api/users
  5. 设置请求头

    • 在 “Headers” 标签下,添加一个新头部:
      • Key: Content-Type
      • Value: application/json
  6. 编写请求体

    • 切换到 “Body” 标签。
    • 选择 raw 选项。
    • 在右侧下拉菜单中选择 JSON
  7. 输入 JSON 数据

    • 在文本框中输入一个 JSON 数组,示例如下:
 
 

json

复制代码

[ {"name": "John", "age": 30}, {"name": "Jane", "age": 25} ]

示例

以下是你在 Postman 中应该输入的完整设置:

  • 请求方法POST
  • URLhttp://localhost:8080/api/users
  • 请求头
    • Content-Type: application/json
  • 请求体
 
 

json

复制代码

[ {"name": "John", "age": 30}, {"name": "Jane", "age": 25} ]

发送请求

点击 “Send” 按钮发送请求。你将看到返回的响应,通常是你所创建的用户列表或其他响应数据。

注意事项

  • 确保后端服务正在运行,并且 URL 和端口正确。
  • 确保你的 JSON 数据格式正确,符合 JSON 语法。

通过以上步骤,你可以轻松地在 Postman 中列举并发送一个包含 List 的 POST 请求。如果你有其他问题或需要进一步的帮助,请告诉我!

在 Postman 中发送一个数组非常简单。以下是具体步骤和示例,帮助你发送一个包含数组的 POST 请求。

步骤

  1. 打开 Postman:确保 Postman 已经安装并运行。

  2. 创建新请求

    • 点击 “+” 按钮,打开一个新的请求选项卡。
  3. 选择请求方法

    • 在请求方法下拉菜单中选择 POST
  4. 输入 URL

    • 在 URL 输入框中输入你的 API 端点,例如 http://localhost:8080/api/users
  5. 设置请求头

    • 点击 “Headers” 标签。
    • 添加一个新的头部:
      • Key: Content-Type
      • Value: application/json
  6. 编写请求体

    • 切换到 “Body” 标签。
    • 选择 raw 选项。
    • 在右侧下拉菜单中选择 JSON
  7. 输入 JSON 数组

    • 在文本框中输入一个 JSON 数组。例如,如果你要发送用户数组,可以这样写:
 
 

json

复制代码

[ "Item 1", "Item 2", "Item 3" ]

示例

以下是你在 Postman 中应该输入的完整设置:

  • 请求方法POST
  • URLhttp://localhost:8080/api/users
  • 请求头
    • Content-Type: application/json
  • 请求体
 
 

json

复制代码

[ "Item 1", "Item 2", "Item 3" ]

发送请求

完成以上设置后,点击 “Send” 按钮发送请求。你将看到返回的响应。

注意事项

  • 确保你的后端服务正在运行,并且 URL 和端口正确。
  • 确保 JSON 数据格式正确,符合 JSON 语法。

通过以上步骤,你可以轻松地在 Postman 中发送一个包含数组的 POST 请求。如果你有其他问题或需要进一步的帮助,请告诉我!

在 Postman 中发送一个包含 Map 的 POST 请求也很简单。以下是详细步骤和示例,帮助你发送一个包含 Map 的请求体。

步骤

  1. 打开 Postman:确保 Postman 已经安装并运行。

  2. 创建新请求

    • 点击 “+” 按钮,打开一个新的请求选项卡。
  3. 选择请求方法

    • 在请求方法下拉菜单中选择 POST
  4. 输入 URL

    • 在 URL 输入框中输入你的 API 端点,例如 http://localhost:8080/api/map
  5. 设置请求头

    • 点击 “Headers” 标签。
    • 添加一个新的头部:
      • Key: Content-Type
      • Value: application/json
  6. 编写请求体

    • 切换到 “Body” 标签。
    • 选择 raw 选项。
    • 在右侧下拉菜单中选择 JSON
  7. 输入 JSON 对象

    • 在文本框中输入一个 JSON 对象,代表 Map。例如:
 
 

json

复制代码

{ "key1": "value1", "key2": "value2", "key3": "value3" }

示例

以下是你在 Postman 中应该输入的完整设置:

  • 请求方法POST
  • URLhttp://localhost:8080/api/map
  • 请求头
    • Content-Type: application/json
  • 请求体
 
 

json

复制代码

{ "key1": "value1", "key2": "value2", "key3": "value3" }

发送请求

完成以上设置后,点击 “Send” 按钮发送请求。你将看到返回的响应,通常是处理后的结果。

注意事项

  • 确保后端服务正在运行,并且 URL 和端口正确。
  • 确保 JSON 数据格式正确,符合 JSON 语法。


http://www.kler.cn/a/380364.html

相关文章:

  • PyQt5的安装与简介
  • 【Java知识】Java基础-对象排序的实现
  • Centos7.6离线安装软件
  • git reset 删除错误提交
  • ABeam 德硕 | 共探AI时代人才新生态,ABeam旗下德硕管理咨询(上海)有限公司荣膺2024杰出雇主!
  • 再探“构造函数”(2)友元and内部类
  • Swift 开发教程系列 - 第1章:Swift 简介与开发环境配置
  • Ubuntu下网络抓包工具:Wireshark与Tcpdump实例解析
  • 科技 | 谷歌 AI 生成代码争议
  • mysql到doris的DDL整库转换工具
  • Nop平台与APIJSON的功能对比
  • 国际化教育品牌的人力资源管理利器
  • CVE-2024-51567 CyberPanel upgrademysqlstatus 远程命令执行
  • JavaEE初阶-----servlet-api,Maven创建项目,部署,打包,测试全过程
  • 分类模型onnx推理,并生成混淆矩阵
  • 如何在本地Linux服务器搭建WordPress网站结合内网穿透随时随地可访问
  • 使用 Python 中的 pydub实现 M4A 转 MP3 转换器
  • element-plus按需引入报错IconsResolver is not a function
  • 经纬恒润车载TSN网络测试仪TestBase-ATT全新上线!
  • C#、C和C++的主要区别
  • Python | Leetcode Python题解之第530题二叉搜索树的最小绝对差
  • 将Notepad++添加到右键菜单【一招实现】
  • Rust 力扣 - 1297. 子串的最大出现次数
  • 使用python爬取某新闻网并进行数据分析
  • 【论文阅读笔记】Wavelet Convolutions for Large Receptive Fields
  • 论文阅读(一种基于球面投影和特征提取的岩石点云快速配准算法)