【注解】Spring IOC、Spring MVC、Springboot、Mybatis、MyBatis Plus、Spring-data-jpa注解、Lombok注解

一、Spring IOC常用注解:

@Component

  • 用于实例化Bean。
  • 可以在注解的value属性中指定放入IOC容器的对象的id。把当前类new一份放入ioc容器中。
  • 替代了XML配置中的bean标签。

@Configuration

  • 用于配置类上,让Spring扫描该类中的内容。
  • 功能与@Component类似,但在文档上有所不同。

@Repository

  • 用于DAO层类上,也用于实例化Bean。
  • 实际上,它是@Component的一个变种。

@Service

  • 用于Service层类上,也用于实例化Bean。
  • 实际上,它是@Component的一个变种。

@Autowired

  • 用于字段上,实现根据类型和当前变量名称进行依赖注入
  • 首先根据类型进行匹配,如果存在多个类型相同的Bean,会根据@Qualifier注解的值进行进一步匹配,或者使用变量名进行匹配。
  • 替代了以前XML配置中的property和set注入方式。

@Qualifier

  • 结合@Autowired一起使用,用于根据名称进行依赖注入。
  • 当根据类型匹配找到多个相同类型的Bean时,进一步根据@Qualifier注解的值进行匹配,找到Bean的id等于它的。

@Bean

  • 用于方法上,标识将方法返回的对象存储到Spring容器中。
  • 可以手动引入第三方对象到Spring容器中。

@Resource

  • JDK自带的注解。
  • 相当于@Autowired+@Qualifier,按照名称进行注入。
  • 注意:在JDK 11及以后的版本中,需要引入相应的依赖。
  • jdk11版本以及之后的版本需要导入下面的包
		<dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
  • jdk19版本需要导入雅加达包
		<dependency>
            <groupId>jakarta.annotation</groupId>
            <artifactId>jakarta.annotation-api</artifactId>
            <version>2.1.1</version>
        </dependency>

@Value

  • 用于从配置文件中自动获取值。
  • 结合@PropertySource注解读取配置文件。

在这里插入图片描述

@Transactional事务

  • @Transactional 用于标记一个方法或类,指示该方法或类需要在事务管理下执行。通常用于处理数据库事务,确保一组操作要么全部成功,要么全部失败。
  • 可以设置rollbackFor属性,指定哪些异常会导致回滚事务。
  • 通常设置@Transactional(rollbackFor = Exception.class)
  • 详细见【@Transactional注解配置详解

以上是Spring IOC常用注解的基本用法和作用。这些注解可以帮助简化配置和依赖注入,提高代码的可维护性和灵活性。


二、Spring MVC常用注解:

@Controller

  • 用于标识控制器类。
  • 表明它是servlet层。
  • 告诉Spring容器将该类注册为处理HTTP请求和生成响应的控制器。

@RestController

  • 组合注解,是@Controller的变体,通常用于创建RESTful API控制器。它会自动将方法返回的对象序列化为JSON或XML响应。

  • 等同于@Controller + @ResponseBody,表示该类中的所有方法返回的数据直接写入HTTP响应体。

    @RestController
    public class MyRestController {
        @GetMapping("/api/user")
        public ResponseEntity<User> getUser() {
            User user = userService.getUser();
            return ResponseEntity.ok(user);
        }
    }
    

@RequestMapping

  • 用于映射HTTP请求和控制器方法。

  • 默认通吃get和post请求。

  • 可以在类级别和方法级别使用,用于指定URL路径,HTTP方法,参数匹配等。

  • @RequestMapping注解的位置
    @RequestMapping标识一个类:设置映射请求的请求路径的初始信息
    @RequestMapping标识一个方法:设置映射请求请求路径的具体信息

  • @RequestMapping(value = "/user", method = RequestMethod.GET)@GetMapping("/user")

@GetMapping、@PostMapping、@PutMapping、@DeleteMapping

  • 组合注解,用于简化常见HTTP请求方法的映射。
  • GetMapping本质也是RequestMapping,只是写死了是GET请求
  • 分别对应GET、POST、PUT和DELETE请求。

@RequestParam(重要)

  • 用于从HTTP请求中获取请求参数的值。
  • 将请求参数和控制器方法的形参创建映射关系。
  • 可以用于方法参数前,也可以用于方法参数上。
    在这里插入图片描述

@PathVariable

  • 用于从URL路径中获取变量的值。
  • 可以用于方法参数前。
  • 支持路径中的占位符(重点)
@GetMapping("/user/{userid}")
public String getUserById(@PathVariable("userid") Long[] id){
	...
}

@RequestBody

  • 用于将HTTP请求的请求体直接映射到方法参数。
  • 通常用于接收JSON格式的数据。

使用@RequestBody注解接收JSON数据:

@RestController
@RequestMapping("/api")
public class MyController {

    @PostMapping("/addUser")
    public ResponseEntity<String> addUser(@RequestBody User user) {
        // 在这里可以访问从HTTP请求的JSON请求体中映射的User对象
        // 执行添加用户的业务逻辑
        return ResponseEntity.ok("User added successfully.");
    }
}

上述代码中,@RequestBody注解用于将HTTP请求的JSON请求体映射到User对象中。在addUser方法中,可以访问并处理接收到的JSON数据。

@ResponseBody

  • 用于将方法返回的数据直接写入HTTP响应体。常用于返回JSON数据。
  • 需要ObjectMapper的,需要添加依赖jackson,spring-boot不需要,spring-boot-start-web里面自带了
  • 常用于RESTful风格的控制器方法。

使用@ResponseBody注解返回JSON数据:

@RestController
@RequestMapping("/api")
public class MyController {

    @GetMapping("/getUser/{id}")
    @ResponseBody
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        // 从数据库或其他地方获取用户信息
        User user = userService.getUserById(id);
        if (user != null) {
            return ResponseEntity.ok(user);
        } else {
            return ResponseEntity.notFound().build();
        }
    }
}

在上述代码中,@ResponseBody注解用于将User对象直接序列化为JSON格式,并将其写入HTTP响应体。这样,当客户端访问/api/getUser/{id}时,将返回一个包含用户信息的JSON响应。

请注意,Spring Boot通常会自动配置Jackson来处理JSON序列化和反序列化,因此不需要额外的依赖项。

@RequestHeader

  • 用于获取HTTP请求头的值。
  • 可以用于方法参数前。

@ModelAttribute

  • 用于将方法返回的数据添加到模型中,通常在视图渲染前调用。
  • 可以用于方法参数前。

@SessionAttributes

  • 用于将模型中的属性暂存到HTTP会话中,通常用于多个请求之间共享数据。
  • 声明在控制器类上。

@ExceptionHandler

  • 用于处理异常情况的方法。
  • 可以在控制器类中定义,用于处理特定类型的异常,以提供友好的错误信息。

@InitBinder

  • 用于自定义数据绑定和验证规则。
  • 可以在控制器类中定义,通常用于处理表单数据的绑定和验证。

@CrossOrigin

  • 用于处理跨域请求。
  • 可以在方法或控制器类上使用,允许指定允许跨域的来源,方法,头等。

这些Spring MVC注解可以帮助简化Web应用程序的开发,实现了路由、参数解析、数据绑定、响应处理等功能,提高了开发效率。


@Slf4j注解 会自动生成一个log对象

三、Springboot常用注解:

以下是一些常用的Spring Boot注解以及相应的示例代码:

@SpringBootApplication

  • @SpringBootApplication 是一个组合注解,它包括 @Configuration@EnableAutoConfiguration@ComponentScan 注解。
  • 通常放在主应用程序类上,用于标识一个Spring Boot应用程序的入口点。
@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

@MapperScan

  • @MapperScan 用于扫描 MyBatis Mapper 接口的包路径,以便将它们注册为 Spring Bean。这使得 MyBatis Mapper 接口可以被注入并用于数据库访问。

@EnableAsync实现异步调用

  • @EnableAsync 用于开启 Spring 的异步支持,允许方法异步执行。可以用于处理需要异步处理的任务,例如发送电子邮件或执行长时间运行的操作。

@EnableScheduling开启定时注解的扫描

  • @EnableScheduling 用于开启 Spring 的定时任务支持,允许方法定期执行。可以用于编写定时任务,例如定期执行数据备份或清理任务。

@EnableJpaAuditing

  • @EnableJpaAuditing 用于启用 Spring Data JPA 的审计功能,允许自动记录实体的创建和修改时间以及创建和修改的用户。通常在配置类上使用。

@ConfigurationProperties

  • @ConfigurationProperties用于将配置文件中的属性绑定到Java类的字段上,方便配置的读取和管理。示例:
@Component
@ConfigurationProperties(prefix = "myapp")
public class MyAppConfig {
    private String appName;
    private int maxUsers;

    // 省略getter和setter
}

@EnableAutoConfiguration

  • @EnableAutoConfiguration启用Spring Boot的自动配置功能,根据项目的依赖项自动配置应用程序。通常不需要显式使用此注解。

@Transactional

  • Springboot默认集成事务,只主要在方法上加上@Transactional即可

@ExceptionHandler(Exception.class)

  • 可以用来统一处理方法抛出的异常,@ExceptionHandler注解中可以添加参数,参数是某个异常类的class,代表这个方法专门处理该类异常

  • @ExceptionHandler 注解用于处理特定类型的异常,可以将异常处理逻辑放在一个特定的方法中,从而实现异常的统一处理。这个方法通常被放置在控制器类中,以处理在该控制器内抛出的异常。具体来说:

  • @ExceptionHandler(Exception.class) 表示处理所有类型的异常。可以将其替换为特定的异常类,以处理特定类型的异常。

  • 通过为 @ExceptionHandler 注解的方法提供异常类作为参数,可以指定该方法用于处理特定异常类型。例如,@ExceptionHandler(NullPointerException.class) 表示该方法将处理 NullPointerException 异常。

  • @ExceptionHandler 方法通常返回一个视图或响应,用于指示异常情况下的用户界面或客户端响应。

  • 这种方式允许在应用程序的不同部分创建专门的异常处理逻辑,以更好地管理异常情况,并提供更友好的用户体验。在 Spring MVC 中,@ExceptionHandler 注解通常与 @ControllerAdvice 注解一起使用,以创建全局的异常处理器,从而实现全局的异常处理。

使用@Scheduled创建定时任务

  • 在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置

  • 启动类加上@EnableAsync ,需要执行异步方法上加入 @Async

  • 在方法上加上@Async之后 底层使用多线程技术

@EnableAsync //实现异步调用
@EnableScheduling //开启定时注解的扫描
@MapperScan("com.itszt23.springboot.mapper")
@SpringBootApplication
public class SpringBootDemoApp {

测试注解

当您使用JUnit进行Spring项目或Spring Boot项目的单元测试时,通常需要使用不同的注解来配置测试环境。下面是针对Spring项目和Spring Boot项目的测试注解示例:

Spring项目测试注解示例:

@RunWith(SpringJUnit4ClassRunner.class) // 使用SpringJUnit4ClassRunner运行测试
@ContextConfiguration("classpath:spring-ioc.xml") // 指定Spring配置文件的位置
public class SpringProjectTest {

    @Before
    public void setUp() throws Exception {
        // 测试初始化操作
    }

    @Test
    public void testSomething() {
        // 执行测试逻辑
    }
}

在上面的示例中,@RunWith(SpringJUnit4ClassRunner.class) 用于告诉JUnit使用Spring提供的测试运行器,而 @ContextConfiguration 用于指定Spring配置文件的位置。

Spring Boot项目测试注解示例:

@SpringBootTest // 使用Spring Boot的测试注解
public class SpringBootProjectTest {

    @BeforeEach
    public void setUp() throws Exception {
        // 测试初始化操作
    }

    @Test
    public void testSomething() {
        // 执行测试逻辑
    }
}

在Spring Boot项目中,通常使用JUnit 5的注解(例如 @BeforeEach@Test),并且使用 @SpringBootTest 注解来启用Spring Boot的测试支持。Spring Boot会自动加载应用程序的配置,并准备一个Spring应用程序上下文供测试使用。

四、Mybatis常用注解:

@Select

  • 用于声明查询语句,可以放在接口方法上。
@Select("SELECT * FROM users WHERE id = #{id}")
User selectUserById(int id);

@Insert

  • 用于声明插入语句,可以放在接口方法上。
    @Insert("INSERT INTO users (name, email) VALUES (#{name}, #{email})")
    int insertUser(User user);

@Update

  • 用于声明更新语句,可以放在接口方法上。
    @Update("UPDATE users SET name = #{name}, email = #{email} WHERE id = #{id}")
    int updateUser(User user);

@Delete

  • 用于声明删除语句,可以放在接口方法上。
    @Delete("DELETE FROM users WHERE id = #{id}")
    int deleteUser(int id);

@Results

  • 用于配置结果映射,可以放在接口或XML映射文件的方法上。
@Results({
    @Result(property = "id", column = "user_id"),
    @Result(property = "name", column = "user_name"),
    @Result(property = "email", column = "user_email")
})
@Select("SELECT * FROM users")
List<User> selectAllUsers();

五、MyBatis Plus常用注解:

MyBatis Plus是对MyBatis的增强,提供了一些额外的注解来简化数据访问和持久化操作。

@TableName: 用于指定实体类对应的数据库表名。

  • 映射数据库的表名
    @TableName("user")
    public class User {
        // ...
    }

@TableField: 用于指定实体类属性与数据库表字段的映射关系。

映射非主键字段。

  • value 映射字段名

  • exist 表示是否为数据库字段

    如果实体类中的成员变量在数据库中没有对应的字段,则可以使用 @TableField(exist=false)

  • select 表示是否查询该字段

  • fill 表示是否自动填充

    @TableField("user_name")
    private String name;
  • @TableField(fill = FieldFill.INSERT):

    • 该注解用于标识实体类的字段与数据库表字段的映射关系,以及在插入操作时自动填充的字段。
    • fill = FieldFill.INSERT 表示在插入数据时,自动填充该字段的值。
    • 这通常用于记录数据的创建时间,在插入时自动填充当前时间。
  • @TableField(fill = FieldFill.INSERT_UPDATE):

    • 该注解与上面的 @TableField(fill = FieldFill.INSERT) 类似,但它表示在插入和更新操作时都会自动填充该字段的值。
    • 这通常用于记录数据的修改时间,在插入和更新时自动填充当前时间。

@TableId: 用于指定实体类属性作为主键字段。

  • value 映射主键字段名
  • type 设置主键类型,即主键的生成策略
    @TableId(value = "user_id", type = IdType.AUTO)
    private Long id;

这是MyBatis Plus(MP)中常用的注解,用于配置数据库表和实体类的映射关系,以及一些高级特性的开启。让我来详细解释和扩展这些注解:

  • 该注解用于标识实体类的主键字段,以及主键生成策略。
  • value = "id" 表示数据库表中的主键字段名为 “id”。
  • type = IdType.UUID 表示使用UUID作为主键生成策略。
  • MyBatis Plus支持多种主键生成策略,例如自增长、雪花算法、UUID等。IdType 枚举提供了常见的策略选项。

@Version: 用于乐观锁字段的标识。

  • @Version 注解用于标识乐观锁字段,这是一种并发控制的机制,通常用于多用户同时访问数据库时,保证数据的一致性和完整性。让我来详细解释这个注解的作用和用法:
    @Version
    private Integer version;
  1. 作用:

    • 乐观锁是一种通过版本号的方式来实现的并发控制机制。每次更新数据时,都会比较版本号,如果版本号匹配才能执行更新操作,否则拒绝更新,从而避免了多个用户同时修改同一条数据时的数据混乱问题。
  2. 用法:

    • 在实体类中,通常选择一个整数字段作为版本号字段,例如 private Integer version;
    • 使用 @Version 注解标识这个版本号字段,表示它是乐观锁字段。
    • 在数据库表中,需要有一个与版本号字段对应的整数列,用于存储版本号信息。
  3. 实现原理:

    • 当执行更新操作时,MyBatis Plus会自动检查版本号。
    • 如果版本号匹配,更新操作继续执行,并将版本号加1。
    • 如果版本号不匹配,更新操作被拒绝,通常会抛出一个异常,开发者可以根据需要处理这个异常。
  4. 示例:

    • 假设有一个实体类 Product,其中包含了一个 @Version 注解的版本号字段:
     public class Product {
         @TableId(type = IdType.AUTO)
         private Long id;
         private String name;
         @Version // 标识这是版本号字段
    	 private Integer version;
         // 其他字段和方法...
         
     }
  • 当多个线程尝试更新同一个 Product 对象时,只有一个线程能够成功,其他线程会失败并需要进行处理。

乐观锁是一种轻量级的并发控制机制,相比于悲观锁,它更适合处理高并发情况下的数据操作,可以提高系统的并发性能。但需要开发者自行处理版本冲突的情况,通常是通过捕获并处理异常来处理版本冲突。

@TableLogic: 用于逻辑删除字段的标识。

    @TableLogic
    private Integer deleted;
  • @TableLogic(value = “0”, delval = “1”):
    • 该注解用于配置逻辑删除字段的属性。
    • value = "0" 表示逻辑未删除的标志值,默认值是0。
    • delval = "1" 表示逻辑删除的标志值,默认值是1。
    • 逻辑删除是指在数据库中不真正删除数据记录,而是通过修改标志位的方式表示数据是否被删除。
    • 这个注解通常用于配置一个整数类型的字段,例如 is_deleted,用于标识数据是否被逻辑删除。

六、Spring-data-jpa注解

关于JPA的详细使用请看文章Spring-data-jpa入门

jpa常用注解

Java Persistence API (JPA) 中常用的注解:

  1. @Table: 用于指定实体类与数据库表之间的对应关系。name 属性指定了数据库表的名称。@Table(name = "JPA_USER")JPA_USER 是数据库表的名称。

  2. @EntityListeners: 在实体类增删改的时候用于监听事件,通常用于实现审计功能,例如记录创建人、创建时间、修改人、修改时间等信息。value 属性指定了监听类。@EntityListeners(AuditingEntityListener.class)使用 Spring Data JPA 的审计功能,用于记录创建和更新时间。

  3. @Id: 用于标识一个字段为实体的主键。每个实体必须有一个主键字段。

  4. @SequenceGenerator: 用于指定数据库序列的别名,以及在生成主键时使用的别名。sequenceName 属性指定了数据库序列名,name 属性指定了别名。

  5. @GeneratedValue: 用于指定主键的生成方式。strategy 属性指定了主键生成策略,例如数据库自增长,而 generator 属性则选择了使用的主键别名。@GeneratedValue(strategy = GenerationType.IDENTITY)使用了数据库的自增长策略,表示主键将由数据库自动生成。

  6. @Column: 用于指定实体类属性和数据库表之间的对应关系。name 属性指定了数据库表的列名称,unique 属性指定了是否唯一,nullable 属性指定了是否可以为空,insertableupdatable 属性指定了是否可以插入和更新,columnDefinition 属性可以用于定义创建此列的 DDL(Data Definition Language)。 @Column(name = "ID")ID 列将与实体的 id 字段映射。

  7. @CreatedBy: 通常用于审计功能,自动插入创建人信息。

  8. @CreatedDate: 通常用于审计功能,自动插入创建时间。

  9. @LastModifiedBy: 通常用于审计功能,自动更新修改人信息。

  10. @LastModifiedDate: 通常用于审计功能,自动更新修改时间。

  11. @Version: 通常用于实现乐观锁功能,自动更新版本号。

  12. @JsonFormat: 用于将插入、修改、读取的时间以指定的格式展示。pattern 属性指定了展示的格式,timezone 属性指定了国际时区。

@Query注解

@Query 注解是 Spring Data JPA 中用于执行自定义查询的重要注解。它可以将自定义的 SQL 查询语句与 JPA 的方法绑定在一起,以便在查询数据时使用。

@Query 注解有两个主要属性:

  1. value: 用于指定 SQL 查询语句。这可以是原生 SQL 查询(使用 nativeQuery = true 标志),也可以是符合 JPQL(Java Persistence Query Language)语法规范的查询。

  2. nativeQuery: 一个布尔值属性,默认为 false。当设置为 true 时,表示使用原生 SQL 查询,而不是 JPQL 查询。

下面是一个简单的示例,演示如何在 Spring Data JPA 中使用 @Query 注解:

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    // 使用 JPQL 查询
    @Query("SELECT u FROM User u WHERE u.username = :username")
    User findByUsername(@Param("username") String username);

    // 使用原生 SQL 查询
    @Query(value = "SELECT * FROM users WHERE username = :username", nativeQuery = true)
    User findByUsernameNative(@Param("username") String username);
}

findByUsername 方法使用了 JPQL 查询,而 findByUsernameNative 方法使用了原生 SQL 查询。

使用 @Query 注解可以更灵活地定义自定义查询,以满足数据访问需求。这是 Spring Data JPA 强大的一部分,允许以面向对象的方式查询数据库。

七、Lombok注解

Lombok(Project Lombok)是一个 Java 库,它通过注解方式来减少 Java 代码的样板代码,提高开发效率。以下是 Lombok 常用的注解:

  1. @Getter@Setter: 自动生成属性的 getter 和 setter 方法。

    @Getter
    @Setter
    private String name;
    
  2. @ToString: 自动生成 toString 方法。

    @ToString
    public class Person {
        private String name;
        private int age;
    }
    
  3. @EqualsAndHashCode: 自动生成 equalshashCode 方法。

    @EqualsAndHashCode
    public class Person {
        private String name;
        private int age;
    }
    
  4. @NoArgsConstructor: 自动生成无参构造函数。

    @NoArgsConstructor
    public class Person {
        private String name;
        private int age;
    }
    
  5. @AllArgsConstructor: 自动生成包含所有属性的构造函数。

    @AllArgsConstructor
    public class Person {
        private String name;
        private int age;
    }
    
  6. @Data: 自动生成 getter、setter、equalshashCodetoString 方法的组合注解。

    @Data
    public class Person {
        private String name;
        private int age;
    }
    
  7. @Builder: 自动生成构建者模式的构造器。

    @Builder
    public class Person {
        private String name;
        private int age;
    }
    
  8. @Slf4j: 自动生成日志记录器字段。

    @Slf4j
    public class MyService {
        public void doSomething() {
            log.info("Doing something...");
        }
    }
    
  9. @Cleanup: 用于自动资源管理,例如自动关闭流。

    public void processFile(String fileName) {
        @Cleanup FileInputStream fis = new FileInputStream(fileName);
        // 使用 fis 读取文件
    }
    

这些 Lombok 注解可以帮助减少 Java 代码的样板部分,提高代码的可读性和开发效率。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值