Delegate
Date: 2015-09-11

javax.decorator

## Annotation Type Delegate

-     @Target(value={FIELD,PARAMETER})
      @Retention(value=RUNTIME)
      @Documented
      public @interface Delegate

  Identifies the delegate injection point of a decorator. May be applied to a field, bean constructor parameter or initializer method parameter of a decorator bean class.

       @Decorator
       class TimestampLogger implements Logger {
          @Inject @Delegate @Any Logger logger;
          ...
       }

       @Decorator
       class TimestampLogger implements Logger {
          private Logger logger;

          @Inject
          public TimestampLogger(@Delegate @Debug Logger logger) {
             this.logger=logger;
          }
          ...
       }

  A decorator must have exactly one delegate injection point. The delegate injection point must be an injected field, initializer method parameter or bean constructor method parameter.

  The container injects a delegate object to the delegate injection point. The delegate object implements the delegate type and delegates method invocations along the decorator stack. When the container calls a decorator during business method interception, the decorator may invoke any method of the delegate object. If a decorator invokes the delegate object at any other time, the invoked method throws an `IllegalStateException`.

       @Decorator
       class TimestampLogger implements Logger {
          @Inject @Delegate @Any Logger logger;

          void log(String message) {
             logger.log( timestamp() + ": " + message );
          }
          ...
       }

  See Also:
    `@Decorator specifies that a class is a decorator.`