This is the extended description of the proposal:
1. AroundConsruct interceptor
The AroundConstruct annotation denotes lifecycle callback interceptor methods that interpose on invocation of the target instance constructor.
The AroundConstruct interceptor methods may be only defined on interceptor classes and/or superclasses of interceptor classes.
When the AroundConstruct lifecycle callback, if any, is invoked the following rules apply:
- The AroundConstruct lifecycle callback is invoked after the dependency injection has been completed on the interceptor instance. Injection of the target component into interceptor instances that are invoked during the AroundConstruct lifecycle callback, is not supported.
- The target instance is created and its constructor injection is performed, if any, when the last interceptor method in the AroundConstruct interceptor chain invokes the InvocationContext.proceed method.
- The AroundConstruct interceptor method can access the constructed instance using InvocationContext.getTarget method after the InvocationContext.proceed completes.
- An AroundConstruct lifecycle callback interceptor method should not invoke any business methods of the target instance.
- The dependency injection on the target instance is not completed until after invocation of all interceptor methods in the AroundConstruct interceptor chain complete successfully.
- The PostConstruct lifecycle callback, if any, is invoked after the dependency injection has been completed on the target instance.
If the AroundConstruct lifecycle callback is not associated with the target instance, all interceptor methods, including PostConstruct callbacks, if any, are invoked after dependency injection has been completed on both, the interceptor instances and the target instance.
2. Extending InvocationContext interface
a) The InvocationContext interface will be extended with the getConstructor method:
public Constructor getConstructor();
The getConstructor method returns the constructor of the target class for which the AroundConstruct interceptor was invoked. For around-invoke, around-timeout and all other lifecycle callback interceptor methods, getConstructor returns null.
b) The getTarget method description will be modified as follows:
The getTarget method returns the associated target instance; for the AroundConstruct lifecycle callback interceptor method, getTarget returns null if called before proceed method returns.
c) No changes are required for the getMethod and getTimer methods of the InvocationContext as they are already required to return null for lifecycle callback interceptor methods