【Java基础-注解】Java中注解的分类有哪些,如何自定义一个注解,并使用举例

在Java中,注解(Annotation)是一种元数据(metadata)的形式,用于为Java代码(类、方法、变量、参数、包等)提供信息。注解不会直接影响代码的执行,但可以被编译器用来生成代码、在编译时进行格式检查或者由其他工具在运行时进行解析和使用。

注解的分类

Java中的注解可以分为三种类型:

  1. 标记注解(Marker Annotations):没有成员定义的注解,例如@Override。它仅用于标识某种情况或标记某种属性。

  2. 单值注解(Single Value Annotations):只有一个元素的注解,例如@Deprecated("不建议使用的原因")。这种注解虽然只有一个元素,但可以通过value()方法名来省略元素名。

  3. 完整注解(Full Annotations):包含多个元素的注解,例如@Retention@Target。这种注解可以包含多个元素,并且每个元素都有一个名字。

如何自定义一个注解

自定义一个注解需要使用@interface关键字,而不是interface。下面是一个简单的自定义注解的例子:

import java.lang.annotation.ElementType;  
import java.lang.annotation.Retention;  
import java.lang.annotation.RetentionPolicy;  
import java.lang.annotation.Target;  
  
// 自定义一个注解  
@Retention(RetentionPolicy.RUNTIME) // 注解的生命周期  
@Target(ElementType.METHOD) // 注解可以应用的Java元素类型  
public @interface MyAnnotation {  
    // 定义注解的元素  
    String value() default ""; // 定义一个名为value的元素,类型为String,默认值为""  
    int order() default 0; // 定义一个名为order的元素,类型为int,默认值为0  
}
使用注解的举例

在定义好注解之后,你可以在其他Java代码中使用这个注解。下面是一个使用MyAnnotation注解的例子:

public class MyClass {  
      
    // 使用自定义注解  
    @MyAnnotation(value = "这是一个例子", order = 1)  
    public void myMethod() {  
        // 方法体  
    }  
      
    // 另一个使用注解的例子,只使用了value元素,order使用了默认值  
    @MyAnnotation("另一个例子")  
    public void anotherMethod() {  
        // 方法体  
    }  
}
解析和处理注解

要在运行时解析和处理注解,你需要使用反射(Reflection)。Java的java.lang.reflect包提供了读取和处理注解的工具。下面是一个简单的例子,展示如何使用反射来读取MyClassmyMethod方法的MyAnnotation注解:

import java.lang.reflect.Method;  
  
public class AnnotationProcessor {  
    public static void main(String[] args) throws NoSuchMethodException {  
        Class<?> clazz = MyClass.class;  
        Method method = clazz.getMethod("myMethod");  
  
        if (method.isAnnotationPresent(MyAnnotation.class)) {  
            MyAnnotation annotation = method.getAnnotation(MyAnnotation.class);  
            System.out.println("Value: " + annotation.value());  
            System.out.println("Order: " + annotation.order());  
        }  
    }  
}

Java中,使用注解进行依赖注入可以使用多种注解,主要包括: 1. @Autowired:自动装配注解,通过该注解可以自动将需要依赖的Bean注入到当前Bean中。 2. @Qualifier:当有多个同类型的Bean时,使用注解可以指定具体注入哪个Bean。 3. @Resource:与@Autowired类似,也是自动装配注解。不过,@Resource注解可以指定Bean的名称,而@Autowired注解则需要结合@Qualifier注解一起使用。 4. @Value:用于注入简单类型的属性值,如字符串、数字等。 举例说明: ```java @Component public class UserServiceImpl implements UserService { @Autowired private UserDao userDao; @Override public User getUserById(int id) { return userDao.getUserById(id); } } ``` 上述代码中,通过@Autowired注解将UserDao对象注入到UserService实现类中。 ```java @Component public class UserServiceImpl implements UserService { @Autowired @Qualifier("userDaoImpl1") private UserDao userDao; @Override public User getUserById(int id) { return userDao.getUserById(id); } } ``` 上述代码中,当有多个UserDao类型的Bean存在时,通过@Qualifier注解指定具体注入哪个Bean。 ```java @Component public class UserServiceImpl implements UserService { @Resource(name = "userDaoImpl1") private UserDao userDao; @Override public User getUserById(int id) { return userDao.getUserById(id); } } ``` 上述代码中,通过@Resource注解指定需要注入的Bean的名称。 ```java @Component public class UserServiceImpl implements UserService { @Value("${user.default.name}") private String defaultUserName; @Override public User getDefaultUser() { User user = new User(); user.setName(defaultUserName); return user; } } ``` 上述代码中,通过@Value注解注入配置文件中的属性值。其中,${user.default.name}是配置文件中的属性名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值