org.springframework.aop.support

## Class DelegatePerTargetObjectIntroductionInterceptor

- java.lang.Object
- - org.springframework.aop.support.IntroductionInfoSupport
  - - org.springframework.aop.support.DelegatePerTargetObjectIntroductionInterceptor

- All Implemented Interfaces:
    Serializable, Advice, Interceptor, MethodInterceptor, DynamicIntroductionAdvice, IntroductionInfo, IntroductionInterceptor

      public class DelegatePerTargetObjectIntroductionInterceptor
      extends IntroductionInfoSupport
      implements IntroductionInterceptor

  Convenient implementation of the `IntroductionInterceptor` interface.

  This differs from `DelegatingIntroductionInterceptor` in that a single instance of this class can be used to advise multiple target objects, and each target object will have its own delegate (whereas DelegatingIntroductionInterceptor shares the same delegate, and hence the same state across all targets).

  The `suppressInterface` method can be used to suppress interfaces implemented by the delegate class but which should not be introduced to the owning AOP proxy.

  An instance of this class is serializable if the delegates are.

  Note: There are some implementation similarities between this class and `DelegatingIntroductionInterceptor` that suggest a possible refactoring to extract a common ancestor class in the future.

  Since:
    2.0
  Author:
    Adrian Colyer, Juergen Hoeller
  See Also:
    `IntroductionInfoSupport.suppressInterface(java.lang.Class<?>)`, `DelegatingIntroductionInterceptor`, Serialized Form

- - ### Field Summary

    - ### Fields inherited from class org.springframework.aop.support.IntroductionInfoSupport

      `publishedInterfaces`

  - ### Constructor Summary

    Constructors
    Constructor and Description
    `DelegatePerTargetObjectIntroductionInterceptor(Class<?> defaultImplType, Class<?> interfaceType)`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `protected Object` | `doProceed(MethodInvocation mi)` Proceed with the supplied `MethodInterceptor`.
    `Object` | `invoke(MethodInvocation mi)` Subclasses may need to override this if they want to perform custom behaviour in around advice.

    - ### Methods inherited from class org.springframework.aop.support.IntroductionInfoSupport

      `getInterfaces, implementInterfacesOnObject, implementsInterface, isMethodOnIntroducedInterface, suppressInterface`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

    - ### Methods inherited from interface org.springframework.aop.DynamicIntroductionAdvice

      `implementsInterface`

- - ### Constructor Detail

    - #### DelegatePerTargetObjectIntroductionInterceptor

          public DelegatePerTargetObjectIntroductionInterceptor(Class<?> defaultImplType,
                                                                Class<?> interfaceType)

  - ### Method Detail

    - #### invoke

          @Nullable
          public Object invoke(MethodInvocation mi)
                                  throws Throwable

      Subclasses may need to override this if they want to perform custom behaviour in around advice. However, subclasses should invoke this method, which handles introduced interfaces and forwarding to the target.
      Specified by:
        `invoke` in interface `MethodInterceptor`
      Parameters:
        `mi` - the method invocation joinpoint
      Returns:
        the result of the call to `Joinpoint.proceed()`; might be intercepted by the interceptor
      Throws:
        `Throwable` - if the interceptors or the target object throws an exception

    - #### doProceed

          @Nullable
          protected Object doProceed(MethodInvocation mi)
                                        throws Throwable

      Proceed with the supplied `MethodInterceptor`. Subclasses can override this method to intercept method invocations on the target object which is useful when an introduction needs to monitor the object that it is introduced into. This method is never called for `MethodInvocations` on the introduced interfaces.
      Throws:
        `Throwable`