Java 开发之关键注解详细汇总
一、JDK自带的基本注解
@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
- 作用:用于抑制编译器产生警告信息。可以指定要抑制的警告类型,比如
unchecked
(未检查的类型转换警告)、deprecation
(使用已过时的元素警告)等。 - 示例:
@SuppressWarnings("unchecked") public void someMethod() { List list = new ArrayList(); // 这里没有指定泛型类型,会产生未检查的警告,但是被抑制了 }
- 作用:用于抑制编译器产生警告信息。可以指定要抑制的警告类型,比如
二、Java EE相关注解(以Servlet为例)
@WebServlet
- 作用:用于将一个类声明为Servlet。可以在这个注解中配置Servlet的名称、URL模式等属性。
- 示例:
@WebServlet(name = "MyServlet", urlPatterns = {"/myServlet"}) public class MyServlet extends HttpServlet { //... }
@WebFilter
- 作用:用于将一个类声明为过滤器。可以指定过滤器的名称、过滤的URL模式等信息。
- 示例:
@WebFilter(filterName = "MyFilter", urlPatterns = {"/*"}) public class MyFilter implements Filter { //... }
@WebListener
- 作用:用于将一个类声明为监听器,如Servlet上下文监听器、会话监听器等。
- 示例:
@WebListener public class MyServletContextListener implements ServletContextListener { //... }
三、Spring框架相关注解(以Spring Boot为例)
@SpringBootApplication
- 作用:这是一个组合注解,包含了
@Configuration
、@EnableAutoConfiguration
和@ComponentScan
。它用于标记一个主应用类,启动Spring Boot应用。 - 示例:
@SpringBootApplication public class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } }
- 作用:这是一个组合注解,包含了
@Component
- 作用:用于将普通的Java类标记为Spring组件,这些组件会被Spring容器管理。可以通过
@ComponentScan
扫描并加载到容器中。 - 示例:
@Component public class MyComponent { //... }
- 作用:用于将普通的Java类标记为Spring组件,这些组件会被Spring容器管理。可以通过
@Service
- 作用:用于标记业务逻辑层的组件,本质上也是
@Component
,只是语义更明确,表示这是一个服务类。 - 示例:
@Service public class MyService { //... }
- 作用:用于标记业务逻辑层的组件,本质上也是
@Repository
- 作用:用于标记数据访问层(如数据库访问)的组件,同样是
@Component
的一种特殊形式,用于和持久层操作关联。 - 示例:
@Repository
public class MyRepository {
//...
}
@Autowired
- 作用:用于自动装配Spring容器中的Bean。可以用在字段、构造函数、方法等上面,让Spring自动注入依赖的Bean。
- 示例:
@Service
public class MyService {
@Autowired
private MyRepository myRepository;
//...
}
@Qualifier
- 作用:当有多个相同类型的Bean时,和
@Autowired
一起使用来指定要注入的具体Bean的名称或限定符。 - 示例:
@Service
public class MyService {
@Autowired
@Qualifier("specificRepository")
private MyRepository myRepository;
//...
}
@Value
- 作用:用于注入外部配置文件中的值或者直接注入常量值到Spring管理的Bean中。
- 示例:
@Service
public class MyService {
@Value("${my.property.value}")
private String propertyValue;
//...
}
四、Hibernate相关注解(用于对象 - 关系映射,ORM)
@Entity
- 作用:用于将一个Java类标记为实体类,这个实体类可以和数据库中的表进行映射。
- 示例:
@Entity
public class User {
//...
}
@Table
- 作用:用于指定实体类对应的数据库表名。如果不指定,默认使用实体类的类名作为表名。
- 示例:
@Entity
@Table(name = "users")
public class User {
//...
}
@Id
- 作用:用于标记实体类中的主键字段。
- 示例:
@Entity
@Table(name = "users")
public class User {
@Id
private Long id;
//...
}
@GeneratedValue
- 作用:用于指定主键的生成策略,如自增长(
IDENTITY
)、序列(SEQUENCE
)等。 - 示例:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
//...
}
@Column
- 作用:用于定义实体类中的字段和数据库表中的列之间的映射关系。可以指定列名、列的长度、是否可为空等属性。
- 示例:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_name", length = 50, nullable = false)
private String userName;
//...
}
五、JUnit相关注解(用于单元测试)
@Test
- 作用:用于标记一个方法是测试方法。JUnit会执行被这个注解标记的方法来进行单元测试。
- 示例:
import org.junit.jupiter.api.Test;
public class MyTest {
@Test
public void testMethod() {
// 测试逻辑
}
}
@BeforeEach
- 作用:用于标记在每个测试方法执行之前需要执行的方法。通常用于初始化测试数据等操作。
- 示例:
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class MyTest {
private MyClass myObject;
@BeforeEach
public void setup() {
myObject = new MyClass();
}
@Test
public void testMethod() {
// 使用myObject进行测试
}
}
@AfterEach
- 作用:用于标记在每个测试方法执行之后需要执行的方法。通常用于清理测试资源等操作。
- 示例:
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class MyTest {
private MyClass myObject;
@BeforeEach
public void setup() {
myObject = new MyClass();
}
@Test
public void testMethod() {
// 使用myObject进行测试
}
@AfterEach
public void cleanup() {
// 清理myObject相关资源
}
}
@BeforeAll
- 作用:用于标记在所有测试方法执行之前需要执行的方法。这个方法必须是静态方法,并且只会执行一次。
- 示例:
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class MyTest {
private static MyClass myObject;
@BeforeAll
public static void setupAll() {
myObject = new MyClass();
}
@Test
public void testMethod() {
// 使用myObject进行测试
}
}
@AfterAll
- 作用:用于标记在所有测试方法执行之后需要执行的方法。这个方法必须是静态方法,并且只会执行一次。
- 示例:
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class MyTest {
private static MyClass myObject;
@BeforeAll
public static void setupAll() {
myObject = new MyClass();
}
@Test
public void testMethod() {
// 使用myObject进行测试
}
@AfterAll
public static void cleanupAll() {
// 清理myObject相关资源
}
}
六、Lombok相关注解(用于简化Java代码编写)
@Data
- 作用:这是一个组合注解,包含了
@Getter
、@Setter
、@ToString
、@EqualsAndHashCode
和@RequiredArgsConstructor
。用于自动生成常用的方法,如getter和setter方法、toString
方法等。 - 示例:
import lombok.Data;
@Data
public class User {
private String name;
private int age;
}
@Getter
- 作用:用于自动生成字段的getter方法。
- 示例:
import lombok.Getter;
public class User {
@Getter
private String name;
//...
}
@Setter
- 作用:用于自动生成字段的setter方法。
- 示例:
import lombok.Setter;
public class User {
@Setter
private String name;
//...
}
@ToString
- 作用:用于自动生成
toString
方法,方便打印对象的信息。 - 示例:
import lombok.ToString;
@ToString
public class User {
private String name;
private int age;
}
@EqualsAndHashCode
- 作用:用于自动生成
equals
和hashCode
方法,方便比较对象是否相等和计算对象的哈希码。 - 示例:
import lombok.EqualsAndHashCode;
@EqualsAndHashCode
public class User {
private String name;
private int age;
}
@NoArgsConstructor
- 作用:用于自动生成无参构造函数。
- 示例:
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class User {
private String name;
private int age;
}
@AllArgsConstructor
- 作用:用于自动生成全参构造函数。
- 示例:
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class User {
private String name;
private int age;
}
七、其他常用注解
@Retention
- 作用:用于指定注解的保留策略。可以是
SOURCE
(只在源代码中保留,编译器编译时会丢弃)、CLASS
(在字节码文件中保留,但在运行时无法通过反射获取)或RUNTIME
(在字节码文件中保留,并且在运行时可以通过反射获取)。 - 示例:
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public@interface MyAnnotation {
//...
}
@Target
- 作用:用于指定注解可以应用的元素类型,如类、方法、字段、参数等。可以使用
ElementType
枚举中的值来指定,如ElementType.TYPE
(类、接口、枚举)、ElementType.METHOD
(方法)等。 - 示例:
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
public@interface MyAnnotation {
//...
}
@Documented
- 作用:用于指定当生成Javadoc文档时,这个注解也会被包含在文档中。
- 示例:
import java.lang.annotation.Documented;
@Documented
public@interface MyAnnotation {
//...
}
@FunctionalInterface
- 作用:用于标记一个接口是函数式接口。函数式接口是指只有一个抽象方法的接口,这种接口可以用于Lambda表达式。
- 示例:
@FunctionalInterface
public interface MyFunction {
int apply(int x);
}
@Repeatable
- 作用:用于指定一个注解可以在同一个元素上重复使用。需要配合一个容器注解来使用。
- 示例:
import java.lang.annotation.Repeatable;
@Repeatable(MyAnnotations.class)
public@interface MyAnnotation {
//...
}
public@interface MyAnnotations {
MyAnnotation[] value();
}
@MappedSuperclass
- 作用(在JPA中):用于标记一个类是其他实体类的父类,这个父类的属性会被继承到子实体类中,但是这个父类本身不会被映射为一个独立的数据库表。
- 示例:
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public class BaseEntity {
// 公共的实体属性,如id、createDate等
}
@Inherited
- 作用:用于指定一个注解可以被继承。如果一个类被标记了这个可继承的注解,那么它的子类也会自动继承这个注解。
- 示例:
import java.lang.annotation.Inherited;
@Inherited
public@interface MyAnnotation {
//...
}
@Native
- 作用:用于标记一个方法是本地方法,这个方法是用其他语言(如C或C++)实现的。
- 示例:
public class MyClass {
@Native
public static native void myNativeMethod();
}
@SafeVarargs
- 作用:用于标记一个方法,这个方法带有可变参数并且在方法内部对可变参数的使用是类型安全的。
- 示例:
public class MyClass {
@SafeVarargs
public static <T> void myMethod(T... args) {
// 安全地使用可变参数
}
}
@SuppressWarnings("rawtypes")
- 作用:用于抑制关于使用原始类型(未指定泛型类型)的警告。
- 示例:
@SuppressWarnings("rawtypes")
public void myMethod() {
List list = new ArrayList();
}
@Transient
(在JPA中)
- 作用:用于标记一个实体类中的字段,这个字段不会被持久化到数据库中。
- 示例:
import javax.persistence.Entity;
import javax.persistence.Table