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

03---java面试八股文——spring-----注解-------10题

21、什么是基于注解的容器配置

  1. 基于注解的容器配置是指使用注解来代替传统的 XML 配置文件,来配置 Spring 容器和 bean。在基于注解的配置中,开发者可以使用注解来声明 bean、注入依赖关系、管理事务等,而不需要显式地在 XML 配置文件中进行配置。
    • 使用基于注解的容器配置可以简化配置过程,并且使得配置更加直观和易于理解。通过注解,开发者可以在类和方法上添加一些特定的注解,告诉 Spring 容器如何管理这些类和方法。

22、如何在 spring 中启动注解装配?

  1. 第一步:配置组件扫描:首先,需要在 Spring 配置中启用组件扫描,以便 Spring 容器能够自动检测和注册带有特定注解的组件(例如 @Component、@Service、@Repository、@Controller 等)。在 XML 配置文件中,可以使用 <context:component-scan> 元素来配置组件扫描,指定要扫描的基础包路径。(默认情况下,Spring 容器中未打开注解装配。因此,要使用基于注解装配,我们必须通过配置<context:annotation-config/>元素在 Spring 配置文件中启用它。)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 第一步--><context:component-scan base-package="com.knife"/></beans>
  1. 配置注解驱动:如果需要使用其他基于注解的特性,例如自动装配(@Autowired)、资源加载(@Value)、事务管理(@Transactional)等,还需要在 Spring 配置中启用相应的注解驱动功能。可以使用<context:annotation-config>或者 <context:annotation-driven> 元素来启用注解驱动。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 第一步--><context:component-scan base-package="com.knife"/><!-- 第二步--><context:annotation-config /><!-- 	<context:annotation-driven /> --></beans>

23、@Component, @Controller, @Repository,@Service有何区别?

  1. 在Spring框架中,@Component, @Controller, @Repository, 和 @Service 是用来对不同类型的类进行标注的注解,它们都是 @Component 的特殊化,因此它们在某种程度上有相似的功能,但是它们在语义上有所不同,同时也影响着Spring框架对它们的处理方式。它们的主要区别如下:
    • @Component:@Component 是一个通用的注解,用来指示一个类是Spring组件。它可以用在任何类上,表示该类将被Spring自动检测并注册为一个bean。
      • 通常情况下,@Component 用于通用的组件类,没有更具体的角色。
    • @Controller:@Controller 用于标注控制器类,通常是处理Web请求的控制器。它接收HTTP请求并响应相应的HTTP响应,
      • 通常用于构建Web应用程序的后端控制器。在Spring MVC中,@Controller 通常用于标识处理HTTP请求的类。标有它的Bean 会自动导入到 IoC 容器中
    • @Repository:@Repository 用于标注数据访问层(DAO)的类。它通常与数据库交互,执行数据存取、检索等操作。
      • @Repository 注解提供了将数据库异常转换为Spring的数据访问异常的功能。(它将 DAO 导入 IoC 容器,并使未经检查的异常有资格转换为 Spring DataAccessException。)
    • @Service:@Service 用于标注服务层的类,提供业务逻辑的服务。它通常包含应用程序的核心业务逻辑,调用DAO层进行数据访问。
      • @Service 类似于传统的业务逻辑层或服务层,在应用程序中包含了处理业务逻辑的方法。

24、@Required 注解有什么用?

  1. @Required 注解用于标记在 Spring Bean 属性的 setter 方法上,指示 Spring 在装配 bean 时该属性是必需的,即必须要设置一个非空值,否则会抛出 BeanInitializationException 异常。
  2. 这个注解的作用是在装配 bean 时进行验证,确保在属性注入之前必须设置相应的值,以避免因为属性未被设置而导致的潜在问题。
  3. 在使用 @Required 注解时,需要注意以下几点:
    • @Required 注解只能用于 setter 方法。
    • 如果使用 XML 配置文件进行装配,@Required 注解并不会被解析,因此无法生效。
    • 在基于注解的装配中,@Required 注解通常不太常用,因为通常可以通过 @Autowired 和 @Value 注解来完成属性的自动装配和赋值。

25、@Autowired注解有什么用?

  1. @Autowired 注解用于自动装配 bean 的依赖关系。它可以被用来标注在类的字段、构造函数、setter 方法或者配置类的方法上,以实现自动注入所需的依赖。

  2. 具体来说,@Autowired 注解的作用有以下几个方面:

    • 自动装配:当 Spring 容器启动时,它会自动搜索并注入符合类型要求的 bean 实例到带有 @Autowired 注解的字段、方法或者构造函数中。这样就无需手动编写代码来显式地获取依赖对象,Spring 容器会自动完成依赖的注入。
    • 类型匹配:如果存在多个类型匹配的 bean,则 Spring 会根据类型来进行匹配和注入。如果想要根据名称进行匹配,可以结合 @Qualifier 注解一起使用。
    • 可选依赖:@Autowired 注解默认情况下要求依赖对象必须存在,如果找不到匹配的 bean,则会抛出异常。但是可以通过设置 required 属性为 false,来允许依赖对象为 null。
    • 依赖注入的方式:@Autowired 注解可以用在字段、构造函数、setter 方法或者配置类的方法上,因此可以根据个人喜好选择合适的依赖注入方式。

@Qualifier 注解有什么用?

  1. @Qualifier 注解用于与 @Autowired 注解一起使用,帮助 Spring 选择特定的 bean 进行注入,解决多个类型匹配的问题。
  2. 当一个接口或者抽象类有多个具体实现时,Spring 容器无法确定要注入哪一个具体实现。这时,可以结合 @Autowired 和 @Qualifier 注解一起使用,通过指定 bean 的名称或者限定符来解决歧义,告诉 Spring 容器应该选择哪一个 bean 进行注入。
  3. 具体来说,@Qualifier 注解有以下几种使用方式:
      1. 通过名称限定:指定要注入的 bean 的名称,让 Spring 容器根据名称来选择
      1. 通过限定符限定:通过自定义限定符来限定要注入的 bean,结合自定义的限定符注解一起使用。

通过名称限定

@Autowired
@Qualifier("specificBeanName")
private MyDependency dependency;

通过限定符限定:在这个示例中,MyQualifierAnnotation 是一个自定义的限定符注解,用于标识具体的 bean。

@Autowired
@MyQualifierAnnotation
private MyDependency dependency;
  • 通过 @Qualifier 注解,可以明确指定要注入的 bean,从而解决多个类型匹配的问题,确保 Spring 容器能够正确地选择并注入所需的依赖。

27、@RequestMapping注解有什么用?

  1. @RequestMapping 是 Spring MVC 中的一个注解,用于将HTTP请求 映射 到控制器的处理方法上。它告诉 Spring MVC 何时调用特定的方法来处理请求。
    • 此注解可应用于两个级别:
      • 类级别:映射请求的 URL
      • 方法级别:映射 URL 以及 HTTP 请求方法
  2. 具体来说,@RequestMapping 注解有以下几个用途:
    • 处理请求映射:@RequestMapping 注解用于将 HTTP 请求映射到控制器的处理方法上。可以标注在类级别或者方法级别。当标注在类级别时,表示该类中的所有处理方法都共享相同的路径前缀。
    • 定义请求路径:通过指定请求路径(URL)来定义请求的路径模式。可以使用 Ant 风格的路径模式(例如 /users/*、/users/{id})或者正则表达式。
    • 指定请求方法:@RequestMapping 注解还可以用于指定处理请求的 HTTP 方法。可以使用 method 属性来指定支持的 HTTP 方法,例如 GET、POST、PUT、DELETE 等。
    • 处理请求参数:@RequestMapping 注解还可以处理请求参数,可以通过 params 属性来指定请求参数的条件。
    • 处理请求头信息:@RequestMapping 注解还可以处理请求头信息,可以通过headers属性来指定请求头信息的条件。

示例:

@Controller
@RequestMapping("/users")
public class UserController {@GetMapping("/{id}")public String getUser(@PathVariable("id") Long userId) {// 处理获取用户信息的逻辑return "user-details";}@PostMappingpublic String createUser(@RequestBody User user) {// 处理创建用户的逻辑return "redirect:/users/" + user.getId();}
}

在这个示例中,@RequestMapping 注解将 /users 路径映射到 UserController 控制器上。@GetMapping 注解将 /users/{id} 路径映射到 getUser 方法上,并指定了请求的 HTTP 方法为 GET。@PostMapping 注解将 /users 路径映射到 createUser 方法上,并指定了请求的 HTTP 方法为 POST。

28、@RequestBody 注解有什么用?

  1. @RequestBody 注解用于将 HTTP 请求的内容(例如 JSON 或 XML 格式的数据)绑定到方法的参数上,表示请求体的内容应该被映射到被注解标注的方法参数上。

  2. 具体来说,@RequestBody 注解的作用有以下几个方面:

    • 接收请求体数据:@RequestBody 注解用于接收 HTTP 请求的请求体数据,通常用于处理 POST 或 PUT 请求,其中请求体中包含的是客户端传递的数据。
    • 自动转换为对象:当请求体数据是 JSON 或 XML 格式时,Spring MVC 会自动将请求体的内容转换为 Java 对象。Spring 使用内置的消息转换器来完成从请求体到对象的转换。
    • 处理复杂数据类型:@RequestBody 注解通常用于处理复杂的数据类型,例如表单提交、JSON 数据等。在这些情况下,直接通过方法参数来接收请求体的内容更加方便和灵活。

示例:

@PostMapping("/createUser")
public ResponseEntity<String> createUser(@RequestBody User user) {// 处理从请求体中接收到的用户对象userService.save(user);return ResponseEntity.ok("User created successfully");
}

在这个示例中,@RequestBody 注解标注在 createUser 方法的 user 参数上,表示从 HTTP 请求的请求体中接收到的 JSON 或 XML 数据会被转换为 User 对象。这样,我们就可以直接在方法中处理 User 对象,而不需要手动解析请求体的内容。

29、@ResponseBody 注解有什么用?

  1. @ResponseBody 注解用于将方法的返回值直接作为 HTTP 响应的主体(Body)发送给客户端,而不是通过视图解析器渲染成视图。它通常用于 RESTful Web 服务中,用于返回 JSON、XML 或其他格式的数据给客户端。
  2. 具体来说,@ResponseBody 注解的作用有以下几个方面:
    • 将方法返回值序列化为响应体:当控制器方法被 @ResponseBody 注解标记时,方法的返回值将被自动序列化为指定格式(如 JSON、XML 等)的数据,并作为 HTTP 响应的主体内容返回给客户端。
    • 省略视图解析器:与传统的 Spring MVC 视图解析器不同,@ResponseBody 注解直接将数据作为响应的主体,省略了视图解析器的步骤,因此适用于 RESTful 服务等不需要渲染页面的情况。
    • 处理复杂数据类型:@ResponseBody 注解通常用于处理复杂的数据类型,例如返回 JSON 或 XML 格式的数据给客户端。Spring 使用内置的消息转换器来完成从对象到响应体的转换。

示例:

@GetMapping("/user/{id}")
@ResponseBody
public ResponseEntity<User> getUser(@PathVariable("id") Long userId) {User user = userService.getUserById(userId);if (user != null) {return ResponseEntity.ok(user);} else {return ResponseEntity.notFound().build();}
}

在这个示例中,@ResponseBody 注解标注在 getUser 方法上,表示该方法的返回值(User 对象)会被直接序列化为 JSON 格式的数据,并作为 HTTP 响应的主体内容返回给客户端。

30、@Configuration 注解有什么用?

  1. @Configuration 注解用于标识一个类为 Spring 的配置类,告诉 Spring 容器该类中包含了一个或多个 bean 的配置信息。
  2. 具体来说,@Configuration 注解的作用有以下几个方面:
    • 定义配置类:@Configuration 注解用于定义一个配置类,通常在这个类中会包含一些用于配置 bean 的方法。这些方法可以使用 @Bean 注解来声明 bean,也可以使用其他 Spring 注解来配置 bean 的相关信息。
    • 替代 XML 配置:与传统的 XML 配置文件相比,@Configuration 注解提供了一种更加简洁和类型安全的配置方式。通过 Java 类来配置 bean,可以更方便地进行代码版本控制和重构,并且可以利用 Java 编译器的类型检查和自动补全功能。
    • 支持基于 Java 的装配:@Configuration 注解结合 @Bean 注解可以支持基于 Java 的装配方式,即通过 Java 代码来定义和配置 bean,而不是依赖于 XML 配置文件。
    • 支持条件化配置:@Configuration 注解还支持条件化配置,可以结合 @Conditional 注解来根据条件来决定是否创建特定的 bean。这样可以根据不同的环境或者条件来灵活地配置应用程序。

示例:

@Configuration
public class AppConfig {@Beanpublic UserService userService() {return new UserServiceImpl();}@Beanpublic UserRepository userRepository() {return new UserRepositoryImpl();}
}

在这个示例中,AppConfig 类被 @Configuration 注解标注,表示这是一个配置类。userService() 和 userRepository() 方法被 @Bean 注解标注,用于声明并配置了两个 bean,分别是 UserService 和 UserRepository。当 Spring 容器启动时,会根据这个配置类来创建和管理相应的 bean。

相关文章:

  • sqlite删除数据表
  • web学习笔记(四十五)Node.js
  • 第一次运行 Python 项目,使用 python-pptx 提取 ppt 中的文字和图片
  • 前端理论总结(css3)——页面布局方法
  • 野心、梦想与科幻——浅谈外星殖民与软件工程
  • canal: 连接kafka (docker)
  • 北京小蓝蜂科技有限公司 基本情况
  • SAP Fiori开发中的JavaScript基础知识9 - 代码注释,严格模式,JSON
  • Adobe Illustrator 2023 for Mac/Win:创意无限,设计无界
  • 【Qt】:坐标
  • 使用Docker Compose一键部署前后端分离项目(图文保姆级教程)
  • 基于Spring Boot的在线学习系统的设计与实现
  • 虚幻引擎资源加密方案解析
  • vue3+threejs新手从零开发卡牌游戏(十四):调整卡组位置,添加玩家生命值HP和法力值Mana信息
  • 在项目中缓存如何优化?SpringCache接口返回值的缓存【CachePut、CacheEvict、Cacheable】
  • Angular 响应式表单 基础例子
  • Git同步原始仓库到Fork仓库中
  • gops —— Go 程序诊断分析工具
  • JavaScript-Array类型
  • k8s 面向应用开发者的基础命令
  • LeetCode29.两数相除 JavaScript
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • orm2 中文文档 3.1 模型属性
  • Python_网络编程
  • React-Native - 收藏集 - 掘金
  • Vim Clutch | 面向脚踏板编程……
  • 产品三维模型在线预览
  • 当SetTimeout遇到了字符串
  • 简析gRPC client 连接管理
  • 实现菜单下拉伸展折叠效果demo
  • 白色的风信子
  • ionic入门之数据绑定显示-1
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 移动端高清、多屏适配方案
  • (02)vite环境变量配置
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)nsfocus-绿盟科技笔试题目
  • (转)编辑寄语:因为爱心,所以美丽
  • ***监测系统的构建(chkrootkit )
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CLR基本术语
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net Memory Profiler的使用举例
  • .net Stream篇(六)
  • .NET 设计模式初探
  • .NET 中的轻量级线程安全
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .so文件(linux系统)
  • @property @synthesize @dynamic 及相关属性作用探究