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 复制代码
<?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 复制代码
<?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,结合自定义的限定符注解一起使用。

通过名称限定

java 复制代码
@Autowired
@Qualifier("specificBeanName")
private MyDependency dependency;

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

java 复制代码
@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属性来指定请求头信息的条件。

示例:

java 复制代码
@Controller
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public String getUser(@PathVariable("id") Long userId) {
        // 处理获取用户信息的逻辑
        return "user-details";
    }

    @PostMapping
    public 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 数据等。在这些情况下,直接通过方法参数来接收请求体的内容更加方便和灵活。

示例:

java 复制代码
@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 使用内置的消息转换器来完成从对象到响应体的转换。

示例:

java 复制代码
@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。这样可以根据不同的环境或者条件来灵活地配置应用程序。

示例:

java 复制代码
@Configuration
public class AppConfig {

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

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

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

相关推荐
所待.3834 分钟前
JavaEE之线程初阶(上)
java·java-ee
Winston Wood8 分钟前
Java线程池详解
java·线程池·多线程·性能
手握风云-12 分钟前
数据结构(Java版)第二期:包装类和泛型
java·开发语言·数据结构
喵叔哟32 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生38 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
不是二师兄的八戒1 小时前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
带多刺的玫瑰2 小时前
Leecode刷题C语言之统计不是特殊数字的数字数量
java·c语言·算法
陪学2 小时前
百度遭初创企业指控抄袭,维权还是碰瓷?
人工智能·百度·面试·职场和发展·产品运营
计算机毕设指导62 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea