3.6.3 Scopes on Meta Annotations

Scopes can be defined on Meta annotations that you can then apply to your classes. Consider the following example meta annotation:

  1. import static java.lang.annotation.RetentionPolicy.RUNTIME;
  2. import io.micronaut.context.annotation.Requires;
  3. import javax.inject.Singleton;
  4. import java.lang.annotation.Documented;
  5. import java.lang.annotation.Retention;
  6. @Requires(classes = Car.class ) (1)
  7. @Singleton (2)
  8. @Documented
  9. @Retention(RUNTIME)
  10. public @interface Driver {
  11. }
  1. import io.micronaut.context.annotation.Requires
  2. import javax.inject.Singleton
  3. import java.lang.annotation.Documented
  4. import java.lang.annotation.Retention
  5. import static java.lang.annotation.RetentionPolicy.RUNTIME
  6. @Requires(classes = Car.class ) (1)
  7. @Singleton (2)
  8. @Documented
  9. @Retention(RUNTIME)
  10. @interface Driver {
  11. }
  1. import io.micronaut.context.annotation.Requires
  2. import javax.inject.Singleton
  3. @Requires(classes = [Car::class]) (1)
  4. @Singleton (2)
  5. @MustBeDocumented
  6. @Retention(AnnotationRetention.RUNTIME)
  7. annotation class Driver
1The scope declares a requirement on a Car class using Requires
2The annotation is declared as @Singleton

In the example above the @Singleton annotation is applied to the @Driver annotation which results in every class that is annotated with @Driver being regarded as singleton.

Note that in this case it is not possible to alter the scope when the annotation is applied. For example, the following will not override the scope declared by @Driver and is invalid:

Declaring Another Scope

  1. @Driver
  2. @Prototype
  3. class Foo {}

If you wish for the scope to be overridable you should instead use the DefaultScope annotation on @Driver which allows a default scope to be specified if none other is present:

Using @DefaultScope

  1. @Requires(classes = Car.class )
  2. @DefaultScope(Singleton.class) (1)
  3. @Documented
  4. @Retention(RUNTIME)
  5. public @interface Driver {
  6. }
  1. @Requires(classes = Car.class )
  2. @DefaultScope(Singleton.class) (1)
  3. @Documented
  4. @Retention(RUNTIME)
  5. @interface Driver {
  6. }
  1. @Requires(classes = [Car::class])
  2. @DefaultScope(Singleton::class) (1)
  3. @Documented
  4. @Retention(RUNTIME)
  5. annotation class Driver
1DefaultScope is used to declare which scope to be used if none is present