001 /***************************************************************************** 002 * Copyright (C) PicoContainer Organization. All rights reserved. * 003 * ------------------------------------------------------------------------- * 004 * The software in this package is published under the terms of the BSD * 005 * style license a copy of which has been included with this distribution in * 006 * the LICENSE.txt file. * 007 * * 008 * Original code by Paul Hammant & Obie Fernandez & Aslak * 009 *****************************************************************************/ 010 011 package org.picocontainer; 012 013 import java.lang.reflect.Constructor; 014 import java.lang.reflect.Member; 015 import java.lang.reflect.Method; 016 017 /** 018 * A component monitor is responsible for monitoring the component instantiation 019 * and method invocation. 020 * 021 * @author Paul Hammant 022 * @author Obie Fernandez 023 * @author Aslak Hellesøy 024 * @author Mauro Talevi 025 */ 026 public interface ComponentMonitor { 027 028 Object KEEP = new Object(); 029 030 /** 031 * Event thrown as the component is being instantiated using the given constructor 032 * 033 * @param container 034 * @param componentAdapter 035 * @param constructor the Constructor used to instantiate the addComponent @return the constructor to use in instantiation (nearly always the same one as passed in) 036 */ 037 <T> Constructor<T> instantiating(PicoContainer container, ComponentAdapter<T> componentAdapter, 038 Constructor<T> constructor 039 ); 040 041 /** 042 * Event thrown after the component has been instantiated using the given constructor. 043 * This should be called for both Constructor and Setter DI. 044 * 045 * @param container 046 * @param componentAdapter 047 * @param constructor the Constructor used to instantiate the addComponent 048 * @param instantiated the component that was instantiated by PicoContainer 049 * @param injected the components during instantiation. 050 * @param duration the duration in milliseconds of the instantiation 051 */ 052 053 <T> void instantiated(PicoContainer container, ComponentAdapter<T> componentAdapter, 054 Constructor<T> constructor, 055 Object instantiated, 056 Object[] injected, 057 long duration); 058 059 /** 060 * Event thrown if the component instantiation failed using the given constructor 061 * 062 * @param container 063 * @param componentAdapter 064 * @param constructor the Constructor used to instantiate the addComponent 065 * @param cause the Exception detailing the cause of the failure 066 */ 067 <T> void instantiationFailed(PicoContainer container, 068 ComponentAdapter<T> componentAdapter, 069 Constructor<T> constructor, 070 Exception cause); 071 072 /** 073 * Event thrown as the component method is being invoked on the given instance 074 * 075 * @param container 076 * @param componentAdapter 077 * @param member 078 * @param instance the component instance 079 * @param args 080 */ 081 Object invoking(PicoContainer container, ComponentAdapter<?> componentAdapter, Member member, Object instance, Object[] args); 082 083 /** 084 * Event thrown after the component method has been invoked on the given instance 085 * 086 * @param container 087 * @param componentAdapter 088 * @param member 089 * @param instance the component instance 090 * @param duration 091 * @param args 092 * @param retVal 093 */ 094 void invoked(PicoContainer container, 095 ComponentAdapter<?> componentAdapter, 096 Member member, 097 Object instance, 098 long duration, Object[] args, Object retVal); 099 100 /** 101 * Event thrown if the component method invocation failed on the given instance 102 * 103 * @param member 104 * @param instance the component instance 105 * @param cause the Exception detailing the cause of the failure 106 */ 107 void invocationFailed(Member member, Object instance, Exception cause); 108 109 /** 110 * Event thrown if a lifecycle method invocation - start, stop or dispose - 111 * failed on the given instance 112 * 113 * @param container 114 * @param componentAdapter 115 * @param method the lifecycle Method invoked on the component instance 116 * @param instance the component instance 117 * @param cause the RuntimeException detailing the cause of the failure 118 */ 119 void lifecycleInvocationFailed(MutablePicoContainer container, 120 ComponentAdapter<?> componentAdapter, Method method, 121 Object instance, 122 RuntimeException cause); 123 124 /** 125 * No Component has been found for the key in question. Implementers of this have a last chance opportunity to 126 * specify something for the need. This is only relevant to component dependencies, and not to 127 * container.getComponent(<key>) in your user code. 128 * 129 * @param container 130 * @param componentKey 131 */ 132 Object noComponentFound(MutablePicoContainer container, Object componentKey); 133 134 /** 135 * A mechanism to monitor or override the Injectors being made for components. 136 * 137 * @param injector 138 * @return an Injector. For most implementations, the same one as was passed in. 139 */ 140 Injector newInjector(Injector injector); 141 142 /** 143 * A mechanism to monitor or override the Behaviors being made for components. 144 * 145 * @param behavior 146 * @return an Behavior. For most implementations, the same one as was passed in. 147 */ 148 Behavior newBehavior(Behavior behavior); 149 }