java元注解详解

要想灵活应用自定义注解,首先来深入了解一下java元注解

  1. @Inherited
    • 类继承关系中,子类会继承父类中带有@Inherited的注解;
    • 接口继承关系中, 子接口不会继承父类接口的任何注解,不管有没有被@Inherited修饰
    • 类实现关系中,实现类不会继承任何接口的注解
  2. @Target
    @Target说明了Annotation所修饰的对象范围:Annotation可被用于 packages、types(类、接口、枚举、Annotation类型),类型成员(方法、构造方法、成员变量、枚举值),方法参数和本地变量(如循环变量,catch参数),在Annotation类型的声明中使用了target可更加明晰其修饰的目标。
    作用:用户描述注解的使用范围(即:被描述的注解可以用在什么地方)
    取值(ElementType)有:
类型用途
CONSTUCTOR用于描述构造器
FIELD用于描述域
LOCAL_VARIABLE用于描述局部变量
METHOD用于描述方法
PACKAGE用于描述包
TYPE用于描述类,接口(包括注解类型)或enum声明

使用实例:

@Target(ElementType.TYPE)
public @interface Table {
    /**
     * 数据表名称注解,默认值为类名称
     * @return
     */
    public String tableName() default "className";
}
 
@Target(ElementType.FIELD)
public @interface NoDBColumn {
 	
}
注解Table可以用于注解类、接口(包括注解类型)或者enum声明,而注解NoDBColumn仅可用于注解类的成员变量
  1. @Retention
    该被保留的时间长短:某些Annotion仅出现在源码中,儿被编译器丢弃;而另一些被编译在class文件中;编译在class中的Annotion可能会被虚拟机忽略,而另一些在class被装载时将被读取(请注意并不影响class的执行,因为Annotion与class在使用上是被分离的)。使用这个meta-Annotation可以对Annotion的“生命周期” 限制。
    作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:别描述的注解在什么范围有效)
    取值(RetentionPoicy)有:
类型作用说明
SOURCE在源文件中有效(即源文件保留)仅出现在源代码中,而被编译器丢弃
CLASS在class中有效(即在class保留)被编译在class文件中
RUNTIME在运行时有效(即运行时保留)编译在class文件中

Retention meta-annotion类型有唯一的value作为成员,他的取值来自java.lang.annotionPolicy的枚举类型。具体实例如下;

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
    public String name() default "fieldName";
    public String setFuncName() default "setField";
    public String getFuncName() default "getField"; 
    public boolean defaultDBValue() default false;
}
Column注解的RetentionPolicy的属性值是RUNTIME,这样注解处理器可以通过反射,获取到该注解的属性值,从而去做一些运行时的逻辑处理
  1. @Documented
    该注解用于描述其他类型的annotion应该被作为被标注的程序成员的公共API,因为可以被例如,javadoc此类的工具文档化,Documented是一个标记注解,没有成员。
  2. @Native since 1.8
  3. @Repeatable since 1.8
    此注解为了解决注解不能再同一个地方重复使用而出现的。可以查看spring 定时任务注解
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
    String CRON_DISABLED = "-";

    String cron() default "";

    String zone() default "";

    long fixedDelay() default -1L;

    String fixedDelayString() default "";

    long fixedRate() default -1L;

    String fixedRateString() default "";

    long initialDelay() default -1L;

    String initialDelayString() default "";
}

然后还需定义容器注解@Schedules,这样@Scheduled多个才可以正常使用

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Schedules {
    Scheduled[] value();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
@Import注解Java中用于导入其他配置类或组件的注解,它可以用在类级别上,用于导入其他类或组件,从而让它们成为当前类的依赖项。@Import注解支持三种不同的导入方式: 1. 导入配置类: 可以使用@Import注解来导入一个或多个配置类,这些配置类会被Spring容器加载并且进行解析,从而可以在应用程序中使用。例如: ``` @Configuration @Import({Config1.class, Config2.class}) public class AppConfig { // Configuration code... } ``` 在上面的例子中,AppConfig类使用@Import注解来导入了Config1和Config2两个配置类。 2. 导入普通的组件: 除了导入配置类外,@Import注解还可以用来导入普通的组件,例如一个普通的Java类、接口或枚举。例如: ``` @Configuration @Import(MyComponent.class) public class AppConfig { // Configuration code... } ``` 在上面的例子中,AppConfig类使用@Import注解来导入了一个名为MyComponent的普通Java组件。 3. 导入ImportSelector: @Import注解还可以使用ImportSelector类型的实现类来动态地导入一组组件,这些组件可以根据不同的条件进行选择。例如: ``` @Configuration @Import(MyImportSelector.class) public class AppConfig { // Configuration code... } ``` 在上面的例子中,AppConfig类使用@Import注解来导入了一个名为MyImportSelector的ImportSelector实现类,它会根据不同的条件来选择一组组件,然后将它们动态导入到应用程序中。 总之,@Import注解是一个非常有用的注解,它可以帮助我们方便地导入其他配置类或组件,从而让我们的应用程序更加灵活和可扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值