一、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;
-
作用:
- 乐观锁是一种通过版本号的方式来实现的并发控制机制。每次更新数据时,都会比较版本号,如果版本号匹配才能执行更新操作,否则拒绝更新,从而避免了多个用户同时修改同一条数据时的数据混乱问题。
-
用法:
- 在实体类中,通常选择一个整数字段作为版本号字段,例如
private Integer version;
。 - 使用
@Version
注解标识这个版本号字段,表示它是乐观锁字段。 - 在数据库表中,需要有一个与版本号字段对应的整数列,用于存储版本号信息。
- 在实体类中,通常选择一个整数字段作为版本号字段,例如
-
实现原理:
- 当执行更新操作时,MyBatis Plus会自动检查版本号。
- 如果版本号匹配,更新操作继续执行,并将版本号加1。
- 如果版本号不匹配,更新操作被拒绝,通常会抛出一个异常,开发者可以根据需要处理这个异常。
-
示例:
- 假设有一个实体类
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) 中常用的注解:
-
@Table
: 用于指定实体类与数据库表之间的对应关系。name
属性指定了数据库表的名称。@Table(name = "JPA_USER")
,JPA_USER
是数据库表的名称。 -
@EntityListeners
: 在实体类增删改的时候用于监听事件,通常用于实现审计功能,例如记录创建人、创建时间、修改人、修改时间等信息。value
属性指定了监听类。@EntityListeners(AuditingEntityListener.class)
使用 Spring Data JPA 的审计功能,用于记录创建和更新时间。 -
@Id
: 用于标识一个字段为实体的主键。每个实体必须有一个主键字段。 -
@SequenceGenerator
: 用于指定数据库序列的别名,以及在生成主键时使用的别名。sequenceName
属性指定了数据库序列名,name
属性指定了别名。 -
@GeneratedValue
: 用于指定主键的生成方式。strategy
属性指定了主键生成策略,例如数据库自增长,而generator
属性则选择了使用的主键别名。@GeneratedValue(strategy = GenerationType.IDENTITY)
使用了数据库的自增长策略,表示主键将由数据库自动生成。 -
@Column
: 用于指定实体类属性和数据库表之间的对应关系。name
属性指定了数据库表的列名称,unique
属性指定了是否唯一,nullable
属性指定了是否可以为空,insertable
和updatable
属性指定了是否可以插入和更新,columnDefinition
属性可以用于定义创建此列的 DDL(Data Definition Language)。@Column(name = "ID")
中ID
列将与实体的id
字段映射。 -
@CreatedBy
: 通常用于审计功能,自动插入创建人信息。 -
@CreatedDate
: 通常用于审计功能,自动插入创建时间。 -
@LastModifiedBy
: 通常用于审计功能,自动更新修改人信息。 -
@LastModifiedDate
: 通常用于审计功能,自动更新修改时间。 -
@Version
: 通常用于实现乐观锁功能,自动更新版本号。 -
@JsonFormat
: 用于将插入、修改、读取的时间以指定的格式展示。pattern
属性指定了展示的格式,timezone
属性指定了国际时区。
@Query注解
@Query
注解是 Spring Data JPA 中用于执行自定义查询的重要注解。它可以将自定义的 SQL 查询语句与 JPA 的方法绑定在一起,以便在查询数据时使用。
@Query
注解有两个主要属性:
-
value
: 用于指定 SQL 查询语句。这可以是原生 SQL 查询(使用nativeQuery = true
标志),也可以是符合 JPQL(Java Persistence Query Language)语法规范的查询。 -
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 常用的注解:
-
@Getter
和@Setter
: 自动生成属性的 getter 和 setter 方法。@Getter @Setter private String name;
-
@ToString
: 自动生成toString
方法。@ToString public class Person { private String name; private int age; }
-
@EqualsAndHashCode
: 自动生成equals
和hashCode
方法。@EqualsAndHashCode public class Person { private String name; private int age; }
-
@NoArgsConstructor
: 自动生成无参构造函数。@NoArgsConstructor public class Person { private String name; private int age; }
-
@AllArgsConstructor
: 自动生成包含所有属性的构造函数。@AllArgsConstructor public class Person { private String name; private int age; }
-
@Data
: 自动生成 getter、setter、equals
、hashCode
和toString
方法的组合注解。@Data public class Person { private String name; private int age; }
-
@Builder
: 自动生成构建者模式的构造器。@Builder public class Person { private String name; private int age; }
-
@Slf4j
: 自动生成日志记录器字段。@Slf4j public class MyService { public void doSomething() { log.info("Doing something..."); } }
-
@Cleanup
: 用于自动资源管理,例如自动关闭流。public void processFile(String fileName) { @Cleanup FileInputStream fis = new FileInputStream(fileName); // 使用 fis 读取文件 }
这些 Lombok 注解可以帮助减少 Java 代码的样板部分,提高代码的可读性和开发效率。