Spring相关注解详细版

1、@RestController @RequestMapping("/api")这两个的作用分别是什么?如何相互区分?

   @RestController 注解用于标识一个类是RESTful风格的Controller,它会将方法的返回值直接转换为HTTP响应体,通常用于返回JSON或XML格式的数据。如果一个类没有 @RestController 注解,Spring将不会将其识别为一个Controller类,也就无法处理HTTP请求。

         @RequestMapping 注解用于映射HTTP请求路径到Controller类或方法上。它可以用于类级别和方法级别,用于定义处理请求的路径。如果一个方法没有 @RequestMapping 注解,Spring将不会将其识别为一个请求处理方法,也就无法处理对应的请求。

2、 @configuration的作用以及@bean的作用?

 @configuration是Spring框架中的一个注解,用于定义配置类,配置类相当于传统的Spring XML配置文件,用来定义bean。

  • @Configuration注解的类会被Spring容器识别并用来生成bean定义和服务请求。

示例:

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

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

 在Spring框架中,@Bean注解的主要作用是告诉Spring容器一个方法会返回一个对象,该对象需要注册为Spring应用上下文中的一个bean。具体来说,@Bean通常用于配置类中,并用于定义生成bean的方法。

以下是@Bean注解的一些主要作用和用途:

  1. 定义bean@Bean注解的方法会返回一个对象,该对象将被Spring容器管理。可以在该方法中配置对象的初始化、配置和依赖关系。

@Configuration
public class AppConfig {
    @Bean
    public MyService myService() {
        return new MyServiceImpl();
    }
}

      2.自定义初始化和销毁方法:可以在@Bean注解中指定自定义的初始化和销毁方法。

@Bean(initMethod = "init", destroyMethod = "cleanup")
public MyService myService() {
    return new MyServiceImpl();
}

      3.依赖注入@Bean方法可以使用参数来表明依赖关系,Spring容器会自动注入这些依赖。

@Bean
public MyService myService(Dependency1 dep1, Dependency2 dep2) {
    return new MyServiceImpl(dep1, dep2);
}

      4.作用域:可以使用@Bean注解来指定bean的作用域(如单例、原型等)。

@Bean
@Scope("prototype")
public MyService myService() {
    return new MyServiceImpl();
}

      5.条件化创建:通过结合其他注解(如@Conditional),可以根据某些条件有选择地创建bean。

@Bean
@Conditional(MyCondition.class)
public MyService myService() {
    return new MyServiceImpl();
}
3、 @Autowired的作用是什么?

 在Spring框架中,@Autowired注解用于实现自动依赖注入。它告诉Spring框架自动装配依赖对象。也就是说,Spring容器会自动寻找和注入匹配的bean到标记了@Autowired注解的字段、构造器或方法中。以下是@Autowired注解的主要作用和用法:

自动注入依赖@Autowired 告诉 Spring 容器将匹配的 Bean 自动注入到标注了 @Autowired 的构造函数、方法或字段中。

简化依赖管理:不需要显式地在代码中手动创建或获取依赖对象,Spring 容器会自动处理依赖关系,使代码更加简洁和可维护。

支持不同的注入方式:支持构造函数注入、方法注入和字段注入。

4、 @Component的作用是什么?@Component和@bean的区别是什么?

@Component 是 Spring 框架中的一个注解,用于将一个类标记为 Spring 的组件(Bean),使其可以被 Spring 容器自动检测、管理和注入。@Component 是一个通用的注解,可以用于任何层的组件。Spring 容器在启动时会扫描带有 @Component 注解的类,并将其实例化、配置并注册到容器中 。

@Component 的作用:

  1. 将类声明为 Bean:使用 @Component 注解的类会被 Spring 自动识别为 Bean,并纳入 Spring 容器的管理中。
  2. 自动扫描和装配:Spring 容器会自动扫描带有 @Component 注解的类并自动实例化它们。
  3. 简化配置:使用 @Component 可以减少 XML 配置文件中的手动 Bean 定义,简化配置过程。

@Component和@bean的区别:

使用场景

  • @Component:用于注解类。通常用于告诉 Spring 这个类需要被作为一个组件进行扫描并管理。它是类级别的注解,适用于那些你直接定义在类上的 Bean。
  • @Bean:用于注解方法。通常用于告诉 Spring 这个方法的返回值需要作为一个 Bean 被管理。它是方法级别的注解,适用于那些你需要以编程的方式创建和配置的 Bean。

使用方式

  • @Component:结合组件扫描(如 @ComponentScan)使用,适合自动发现和装配。
  • @Bean:结合配置类(如 @Configuration)使用,适合显式定义和配置复杂的 Bean。
5、 @Aspect的作用?

 @Aspect 是 Spring AOP(Aspect-Oriented Programming,面向切面编程)中的一个注解,用于定义一个切面(Aspect)。切面是一种横切关注点的模块化表示,它可以用于集中处理诸如日志记录、安全、事务管理等系统级服务,而无需在各个业务逻辑代码中重复这些代码。

@Aspect 的作用:

  1. 定义切面@Aspect 用于声明一个类为切面,切面包含了多个关注点(如日志记录、事务管理等)的具体实现。
  2. 模块化横切关注点:通过切面,可以将那些分散在各个类中的横切关注点代码模块化,提升代码的可维护性和可重用性。
  3. 声明通知(Advice):在切面类中可以定义各种类型的通知(Advice),如前置通知、后置通知、环绕通知、异常通知等,通过这些通知可以在方法执行的不同阶段进行切入。

AOP 基本概念:

  • 切面(Aspect):一个关注点的模块化表示。
  • 连接点(Join Point):程序执行的某个具体点。
  • 通知(Advice):切面在连接点处执行的代码。
  • 切入点(Pointcut):匹配连接点的表达式。
  • 目标对象(Target Object):被通知的对象。
  • 代理(Proxy):通知目标对象后创建的对象。
  • 织入(Weaving):将切面应用到目标对象来创建代理对象的过程。
6、@Resourse 的作用?和@Autowired注解的区别是什么?

主要作用

  1. 注入依赖@Resource 用于自动注入依赖对象,类似于 Spring 框架中的 @Autowired 注解。
  2. 名称匹配@Resource 默认按名称匹配(通过字段名或方法名),如果名称匹配不上,再按类型匹配。
  3. 简化配置:简化配置,使代码更加简洁,便于理解和维护。

@Autowired 的对比

  • 匹配方式

    • @Resource:默认按名称匹配,找不到匹配时按类型匹配。
    • @Autowired:默认按类型匹配,可以结合 @Qualifier 注解按名称匹配。
  • 来源

    • @Resource:属于 Java EE 标准,适用于任何兼容 JSR-250 的框架和容器。
    • @Autowired:属于 Spring 框架特有的注解。
  • 配置灵活性

    • @Resource:支持 nametype 属性来精确控制注入。
    • @Autowired:可以与 @Qualifier 配合使用,提供更灵活的配置选项。

7、 @Qualifier的作用是什么?

@Qualifier 注解是 Spring 框架中用于在依赖注入时区分多个 Bean 的注解。当一个类型有多个候选 Bean 时,@Qualifier 注解可以与 @Autowired@Inject 注解结合使用,以指定需要注入的具体 Bean。它的作用是通过名称来明确指定要注入的 Bean,解决歧义问题。

主要作用

  1. 解决歧义:在同一个类型有多个 Bean 时,通过 @Qualifier 注解指定要注入的 Bean 名称,解决依赖注入的歧义。
  2. 精确注入:与 @Autowired@Inject 注解结合使用,实现精确的依赖注入。

示例如下: 

public interface MyService {
    void performAction();
}

@Service("serviceA")
public class ServiceA implements MyService {
    @Override
    public void performAction() {
        System.out.println("ServiceA performing action");
    }
}

@Service("serviceB")
public class ServiceB implements MyService {
    @Override
    public void performAction() {
        System.out.println("ServiceB performing action");
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    private final MyService myService;

    @Autowired
    public MyComponent(@Qualifier("serviceA") MyService myService) {
        this.myService = myService;
    }

    public void doSomething() {
        myService.performAction();
    }
}
8、 @Transactional是如何使用的?

@Transactional 注解是 Spring 框架中用于声明事务的方法。它能够简化事务管理,使得开发者不必显式地管理事务边界(如 begincommitrollback),而是通过注解的方式来声明某个方法需要事务支持。 

作用

  1. 声明式事务管理:通过注解声明事务边界,而不是通过编程的方式。
  2. 事务属性配置:可以配置事务的传播行为、隔离级别、超时时间等。
  3. 异常回滚:指定哪些异常会触发事务回滚。

 @Transactional 可以应用在类或方法上,通常用于服务层(Service Layer)的类或方法。

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class UserService {
    public void createUser(User user) {
        // 事务代码
    }

    public void updateUser(User user) {
        // 事务代码
    }
}
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {
    @Transactional
    public void createUser(User user) {
        // 事务代码
    }

    @Transactional
    public void updateUser(User user) {
        // 事务代码
    }
}
9、@Validated是干嘛的?

@Validated 是 Spring 框架中的一个注解,主要用于触发方法参数或字段的验证。它通常结合 Java Bean Validation API(如 Hibernate Validator)使用,用于对方法参数或类属性进行校验,以确保其满足一定的约束条件。

使用场景

  1. 方法参数验证:可以在服务层或控制器层的方法参数上使用注解来定义约束,然后使用 @Validated 来触发这些验证。

  2. 类属性验证:可以在类的属性上使用注解来定义约束,然后在类上使用 @Validated 以便在特定时刻触发这些验证,如保存数据时。

示例 :方法参数验证

假设有一个用户注册的服务,我们希望确保传递的用户信息符合一定的约束条件(例如,用户名不能为空,电子邮件格式正确等)。

import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;

@Service
@Validated
public class UserService {
    
    public void registerUser(@NotBlank String username, @Email String email) {
        // 注册逻辑
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;

@RestController
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @PostMapping("/register")
    public void register(@Valid @RequestBody UserRequest request) {
        userService.registerUser(request.getUsername(), request.getEmail());
    }
}

import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;

public class UserRequest {
    
    @NotBlank
    private String username;
    
    @Email
    private String email;

    // Getters and Setters
}

在上面的例子中,只有通过@Validated 注解,@NotBlank 和 @Email 注解才会有用生效,验证 

10、@ Slf4j的作用是什么?

@Slf4j 是 Lombok 库中的一个注解,它用于在类中自动生成一个 SLF4J(Simple Logging Facade for Java)日志记录器对象。使用 @Slf4j 注解,可以简化日志记录器的创建过程,避免手动定义日志记录器对象,从而使代码更加简洁和易读。下面介绍一个使用示例:

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class MyService {

    public void performAction() {
        log.info("Performing some action");
        
        try {
            // 模拟一个可能抛出异常的操作
            int result = 10 / 0;
        } catch (Exception e) {
            log.error("An error occurred while performing action", e);
        }
    }
}

在这个例子中:

  1. @Slf4j 注解自动生成了一个名为 log 的 SLF4J 日志记录器对象。
  2. log.infolog.error 方法用于记录不同级别的日志信息。

 

 

 

 

 

 

 

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值