Java常用注解及其作用
一、Java核心注解
@Override
- 作用:用于标识子类重写父类的方法。它可以帮助编译器检查方法签名是否正确匹配父类中的被重写方法,避免因误写方法名、参数列表等导致的错误。
- 示例:
class Parent {
public void print() {
System.out.println("Parent print");
}
}
class Child extends Parent {
@Override
public void print() {
System.out.println("Child print");
}
}
@Deprecated
- 作用:表示被修饰的元素(类、方法、字段等)已过时,不建议使用。当使用已过时的元素时,编译器会发出警告,提示开发者应该考虑使用其他替代方案。
- 示例:
class OldClass {
@Deprecated
public void oldMethod() {
System.out.println("This is an old method.");
}
}
@SuppressWarnings
- 作用:用于抑制编译器生成特定的警告信息。例如,当代码中存在一些可能导致警告但开发者确定不需要警告的情况时,可以使用该注解来告诉编译器忽略这些警告。
- 示例:
@SuppressWarnings("unchecked")
List list = new ArrayList();
二、Spring框架常用注解
@Component
- 作用:将普通的Java类标记为Spring的组件,使得Spring容器能够扫描并管理这些类的实例。它是一个泛化的概念,包括
@Service
、@Repository
、@Controller
等注解。
- 示例:
@Component
public class MyComponent {
//...
}
@Service
- 作用:用于标注业务逻辑层的组件,明确表示该类是一个服务类,主要处理业务逻辑相关的操作。
- 示例:
@Service
public class UserService {
//...
}
@Repository
- 作用:用于数据访问层(如DAO层)的组件,表明该类是用于与数据库或其他数据存储进行交互的存储库类,方便Spring进行数据访问相关的管理和异常处理。
- 示例:
@Repository
public class UserRepository {
//...
}
@Controller
- 作用:用于标注Web应用中的控制器类,负责处理HTTP请求并返回响应,通常与Spring MVC框架结合使用。
- 示例:
@Controller
public class UserController {
//...
}
@Autowired
- 作用:由Spring容器自动装配依赖关系。可以用于字段、构造函数、方法等,让Spring根据类型自动查找并注入合适的依赖对象。
- 示例:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
//...
}
@Qualifier
- 作用:当存在多个相同类型的候选依赖对象时,与
@Autowired
配合使用,通过指定名称来明确要注入的具体对象。
- 示例:
@Service
public class UserService {
@Autowired
@Qualifier("userRepositoryImpl")
private UserRepository userRepository;
//...
}
@RequestMapping
- 作用:用于映射Web请求到控制器的处理方法。可以指定请求的URL路径、HTTP方法(如GET、POST等)等信息。
- 示例:
@Controller
@RequestMapping("/users")
public class UserController {
@RequestMapping(value = "/list", method = RequestMethod.GET)
public String listUsers() {
//...
return "userList";
}
}
@RestController
- 作用:是
@Controller
和@ResponseBody
的组合注解,用于创建一个返回JSON或其他数据格式而不是视图的Web控制器。
- 示例:
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public User getUserById(@PathVariable("id") Long id) {
//...
return user;
}
}
@RequestBody
- 作用:用于将HTTP请求体中的数据绑定到方法的参数上,通常用于接收JSON或XML等格式的数据并转换为Java对象。
- 示例:
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@RequestMapping(method = RequestMethod.POST)
public User createUser(@RequestBody User user) {
//...
return user;
}
}
@ResponseBody
- 作用:将方法的返回值直接作为HTTP响应体返回,而不是作为视图名称进行解析。常用于返回JSON、XML等数据格式给客户端。
- 示例:
@Controller
@RequestMapping("/api/users")
public class UserApiController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
public User getUserById(@PathVariable("id") Long id) {
//...
return user;
}
}
三、Java持久化(JPA/Hibernate)常用注解
@Entity
- 作用:标记一个Java类为JPA实体类,表示该类可以被映射到数据库表中。
- 示例:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
//...
}
@Table
- 作用:指定实体类对应的数据库表名、表的目录、架构等信息。如果不使用该注解,默认表名与实体类名相同。
- 示例:
@Entity
@Table(name = "user_table")
public class User {
//...
}
@Id
@Entity
public class User {
@Id
private Long id;
//...
}
@GeneratedValue
- 作用:指定主键的生成策略,如自增长(
IDENTITY
)、序列(SEQUENCE
)、表生成(TABLE
)等。
- 示例:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...
}
@Column
- 作用:用于指定实体类字段与数据库表列的映射关系,包括列名、列的长度、是否可为空等属性。
- 示例:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", length = 50, nullable = false)
private String name;
//...
}
@OneToMany
- 作用:定义实体类之间的一对多关系,例如一个用户可以有多个订单。在关系的“一”方使用该注解。
- 示例:
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "user")
private List<Order> orders;
//...
}
@ManyToOne
- 作用:定义实体类之间的多对一关系,在关系的“多”方使用该注解。例如多个订单对应一个用户。
- 示例:
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
//...
}
@JoinColumn
- 作用:在多对一或一对一关系中,指定外键列的相关信息,如列名、是否唯一等。
- 示例:
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...
@ManyToOne
@JoinColumn(name = "user_id", unique = false)
private User user;
//...
}
@ManyToMany
- 作用:定义实体类之间的多对多关系,例如一个学生可以选修多门课程,一门课程可以被多个学生选修。需要使用中间表来存储关系信息。
- 示例:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private List<Course> courses;
//...
}
@JoinTable
- 作用:在多对多关系中,用于指定中间表的相关信息,包括表名、关联的外键列等。
- 示例:
@Entity
public class Student {
//...
@ManyToMany
@JoinTable(name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id"))
private List<Course> courses;
//...
}
四、其他常用注解
@FunctionalInterface
- 作用:用于标记一个接口为函数式接口,即该接口只包含一个抽象方法(除了
default
方法和static
方法)。函数式接口可以用于Lambda表达式等函数式编程场景。
- 示例:
@FunctionalInterface
public interface MyFunction {
int apply(int x);
}
@SafeVarargs
- 作用:在使用可变参数的方法或构造函数中,用于抑制编译器关于可变参数的非受检警告。它表示开发者已经确保了可变参数的使用是类型安全的。
- 示例:
@SafeVarargs
public static <T> void printAll(T... args) {
for (T t : args) {
System.out.println(t);
}
}
@Native
- 作用:用于标记一个字段,表示该字段在本地代码(如C或C++代码)中定义。它通常用于与本地代码进行交互的Java代码中,告知编译器该字段与本地代码相关。
- 示例:
public class NativeExample {
@Native
public static final int MAX_VALUE;
static {
System.loadLibrary("nativeLibrary");
MAX_VALUE = getMaxValueFromNative();
}
private static native int getMaxValueFromNative();
}
@Target
- 作用:用于指定注解的适用目标,可以是类、方法、字段、参数等。例如,可以指定一个注解只能用于方法上。
- 示例:
@Target(ElementType.METHOD)
public @interface MyMethodAnnotation {
//...
}
@Retention
- 作用:用于定义注解的保留策略,即注解在什么阶段可见。可以是
SOURCE
(只在源码阶段可见)、CLASS
(在编译后的类文件中可见,但在运行时不可见)、RUNTIME
(在运行时也可见)。
- 示例:
@Retention(RetentionPolicy.RUNTIME)
public @interface MyRuntimeAnnotation {
//...
}
@Documented
- 作用:表示被该注解修饰的元素会被包含在JavaDoc文档中,方便生成API文档时展示相关信息。
- 示例:
@Documented
public @interface MyDocumentedAnnotation {
//...
}
@Inherited
- 作用:指定注解具有继承性,即如果一个类被该注解修饰,那么它的子类也会自动被该注解修饰。
- 示例:
@Inherited
public @interface MyInheritedAnnotation {
//...
}
@Repeatable
- 作用:从Java 8开始引入,用于表示一个注解可以在同一个元素上重复使用。需要创建一个包含该注解类型元素的容器注解。
- 示例:
@Repeatable(MyRepeatableAnnotations.class)
public @interface MyRepeatableAnnotation {
String value();
}
public @interface MyRepeatableAnnotations {
MyRepeatableAnnotation[] value();
}
@Data
- 作用:来自Lombok库,它是一个组合注解,相当于同时使用了
@Getter
、@Setter
、@ToString
、@EqualsAndHashCode
、@RequiredArgsConstructor
等注解,用于自动生成一些常用的方法,如属性的获取器、设置器、toString
方法、equals
和hashCode
方法以及包含必需参数的构造函数等,减少代码冗余。
- 示例:
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
@Slf4j
- 作用:来自Lombok库,用于在类中自动生成一个基于SLF4J(Simple Logging Facade for Java)的日志记录器对象,方便进行日志记录,避免手动创建日志记录器的繁琐过程。
- 示例:
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MyClass {
public void doSomething() {
log.info("Doing something...");
}
}
Java常用60个注解及其作用
1. 元注解
@Retention
:定义注解的保留策略。
@Target
:指定注解可以用于哪些Java元素。
@Documented
:表明注解应该被Javadoc工具文档化。
@Inherited
:允许子类继承父类的注解。
@Repeatable
:允许注解在同一个声明上使用多次。
2. 标准注解
@Override
:表示当前方法声明打算重写父类中的方法。
@Deprecated
:表示某个程序元素(类、方法等)已经过时。
@SuppressWarnings
:关闭编译器警告。
@SafeVarargs
:抑制泛型警告。
3. Spring框架注解
@Controller
:表示该类是一个Web控制器。
@RestController
:@Controller
和@ResponseBody
的组合注解。
@RequestMapping
:用于映射Web请求到控制器的处理方法上。
@GetMapping
、@PostMapping
、@PutMapping
、@DeleteMapping
、@PatchMapping
:分别处理GET、POST、PUT、DELETE、PATCH请求。
@ResponseBody
:表示该方法的返回值作为响应体。
@RequestBody
:表示方法参数应该从请求体中读取。
@RequestParam
:用于将Web请求参数绑定到控制器处理方法的参数上。
@PathVariable
:用于将URL中的变量绑定到控制器处理方法的参数上。
@ResponseStatus
:用于设置HTTP响应状态码。
@ExceptionHandler
:用于定义异常处理方法。
@Component
、@Service
、@Repository
:用于声明Spring组件。
@Autowired
:自动注入依赖。
4. Hibernate Validator注解
@NotNull
、@NotEmpty
、@NotBlank
:验证字段不为空。
@Size
:验证对象的大小。
@Min
、@Max
:验证数值的最小值和最大值。
@DecimalMin
、@DecimalMax
:验证数值的最小值和最大值(包括边界)。
@Digits
:验证数字的整数和小数部分的位数。
@Email
:验证电子邮件地址的格式。
@Pattern
:验证字符串是否匹配正则表达式。
5. JUnit测试注解
@Test
:标记测试方法。
@Before
、@After
:在每个测试方法之前和之后执行。
@BeforeClass
、@AfterClass
:在所有测试方法之前和之后执行。
@Ignore
:忽略测试方法。
@RunWith
:指定测试运行器。
6. Lombok插件注解
@Data
:自动生成getter、setter、toString、equals、hashCode等方法。
@NoArgsConstructor
、@AllArgsConstructor
:生成无参构造函数和全参构造函数。
@Slf4j
:生成日志对象。
@Accessors(chain = true)
:支持链式调用。
7. MybatisPlus注解
@Mapper
:声明Mybatis的Mapper接口。
@TableName
:指定实体对应的数据库表名。
@TableField
:指定实体类属性对应的数据库字段。
8. Swagger注解
@ApiOperation
:描述接口的作用。
@ApiImplicitParam
:描述接口参数。
9. AOP切面注解
@Aspect
:声明一个类为切面。
@Before
、@After
、@Around
:定义前置通知、后置通知和环绕通知。
@Pointcut
:定义切点。
10. 其他注解
@Transactional
:声明事务管理。
@Async
:声明异步方法。
@Scheduled
:声明定时任务。
评论区