@@ -110,12 +110,12 @@ protected <R extends Service> void createServiceBinding(ServiceInitiator<R> init
110110 }
111111
112112 protected <R extends Service > void createServiceBinding (ProvidedService <R > providedService ) {
113- var binding = locateServiceBinding ( providedService .getServiceRole (), false );
113+ var binding = locateServiceBinding ( providedService .serviceRole (), false );
114114 if ( binding == null ) {
115- binding = new ServiceBinding <>( this , providedService .getServiceRole (), providedService .getService () );
116- serviceBindingMap .put ( providedService .getServiceRole (), binding );
115+ binding = new ServiceBinding <>( this , providedService .serviceRole (), providedService .service () );
116+ serviceBindingMap .put ( providedService .serviceRole (), binding );
117117 }
118- registerService ( binding , providedService .getService () );
118+ registerService ( binding , providedService .service () );
119119 }
120120
121121 protected void visitServiceBindings (Consumer <ServiceBinding <?>> action ) {
@@ -156,18 +156,21 @@ protected void visitServiceBindings(Consumer<ServiceBinding<?>> action) {
156156
157157 // perform a crawl looking for an alternate registration
158158 for ( var binding : serviceBindingMap .values () ) {
159- if ( serviceRole .isAssignableFrom ( binding .getServiceRole () ) ) {
159+ final Class <?> bindingServiceRole = binding .getServiceRole ();
160+ if ( serviceRole .isAssignableFrom ( bindingServiceRole ) ) {
160161 // we found an alternate...
161- SERVICE_LOGGER .alternateServiceRole ( serviceRole .getName (), binding . getServiceRole () .getName () );
162- registerAlternate ( serviceRole , binding . getServiceRole () );
162+ SERVICE_LOGGER .alternateServiceRole ( serviceRole .getName (), bindingServiceRole .getName () );
163+ registerAlternate ( serviceRole , bindingServiceRole );
163164 return (ServiceBinding <R >) binding ;
164165 }
165-
166- if ( binding .getService () != null && serviceRole .isInstance ( binding .getService () ) ) {
167- // we found an alternate...
168- SERVICE_LOGGER .alternateServiceRole ( serviceRole .getName (), binding .getServiceRole ().getName () );
169- registerAlternate ( serviceRole , binding .getServiceRole () );
170- return (ServiceBinding <R >) binding ;
166+ else {
167+ final var bindingService = binding .getService ();
168+ if ( serviceRole .isInstance ( bindingService ) ) {
169+ // we found an alternate...
170+ SERVICE_LOGGER .alternateServiceRole ( serviceRole .getName (), bindingServiceRole .getName () );
171+ registerAlternate ( serviceRole , bindingServiceRole );
172+ return (ServiceBinding <R >) binding ;
173+ }
171174 }
172175 }
173176
@@ -183,10 +186,8 @@ private void registerAlternate(Class<?> alternate, Class<?> target) {
183186 // Fast-path for ClassLoaderService as it's extremely hot during bootstrap
184187 // (and after bootstrap service loading performance is less interesting as it's
185188 // ideally being cached by long-term consumers)
186- if ( ClassLoaderService .class == serviceRole ) {
187- if ( parent != null ) {
188- return parent .getService ( serviceRole );
189- }
189+ if ( ClassLoaderService .class == serviceRole && parent != null ) {
190+ return parent .getService ( serviceRole );
190191 }
191192 // TODO: should an exception be thrown if active == false???
192193 R service = serviceRole .cast ( initializedServiceByRole .get ( serviceRole ) );
@@ -231,7 +232,7 @@ protected <R extends Service> void registerService(ServiceBinding<R> serviceBind
231232 }
232233
233234 // PHASE 1: create service
234- R service = createService ( serviceBinding );
235+ final R service = createService ( serviceBinding );
235236 if ( service == null ) {
236237 return null ;
237238 }
@@ -256,7 +257,7 @@ protected <R extends Service> void registerService(ServiceBinding<R> serviceBind
256257 }
257258
258259 try {
259- R service = serviceBinding .getLifecycleOwner ().initiateService ( serviceInitiator );
260+ final R service = serviceBinding .getLifecycleOwner ().initiateService ( serviceInitiator );
260261 // IMPL NOTE: the register call here is important to avoid potential stack overflow issues
261262 // from recursive calls through #configureService
262263 if ( service != null ) {
@@ -276,18 +277,16 @@ protected <R extends Service> void registerService(ServiceBinding<R> serviceBind
276277 @ Override
277278 public <R extends Service > void injectDependencies (ServiceBinding <R > serviceBinding ) {
278279 final R service = serviceBinding .getService ();
279-
280280 applyInjections ( service );
281-
282281 if ( service instanceof ServiceRegistryAwareService serviceRegistryAwareService ) {
283282 serviceRegistryAwareService .injectServices ( this );
284283 }
285284 }
286285
287286 private <R extends Service > void applyInjections (R service ) {
288287 try {
289- for ( Method method : service .getClass ().getMethods () ) {
290- final InjectService injectService = method .getAnnotation ( InjectService .class );
288+ for ( var method : service .getClass ().getMethods () ) {
289+ final var injectService = method .getAnnotation ( InjectService .class );
291290 if ( injectService != null ) {
292291 processInjection ( service , method , injectService );
293292 }
@@ -299,23 +298,14 @@ private <R extends Service> void applyInjections(R service) {
299298 }
300299
301300 private <T extends Service > void processInjection (T service , Method injectionMethod , InjectService injectService ) {
302- final Class <?>[] parameterTypes = injectionMethod .getParameterTypes ();
303- if ( injectionMethod .getParameterCount () != 1 ) {
304- throw new ServiceDependencyException (
305- "Encountered @InjectService on method with unexpected number of parameters"
306- );
307- }
308-
309- //noinspection rawtypes
310- Class dependentServiceRole = injectService .serviceRole ();
311- if ( dependentServiceRole == null || dependentServiceRole .equals ( Void .class ) ) {
312- dependentServiceRole = parameterTypes [0 ];
313- }
301+ injectDependentService ( service , injectionMethod , injectService ,
302+ dependentServiceRole ( injectionMethod , injectService ) );
303+ }
314304
305+ private <T extends Service > void injectDependentService (T service , Method injectionMethod , InjectService injectService , Class <? extends Service > dependentServiceRole ) {
315306 // todo : because of the use of proxies, this is no longer returning null here...
316307
317- //noinspection unchecked
318- final Service dependantService = getService ( dependentServiceRole );
308+ final var dependantService = getService ( dependentServiceRole );
319309 if ( dependantService == null ) {
320310 if ( injectService .required () ) {
321311 throw new ServiceDependencyException (
@@ -333,6 +323,25 @@ private <T extends Service> void processInjection(T service, Method injectionMet
333323 }
334324 }
335325
326+ private static Class <? extends Service > dependentServiceRole (Method injectionMethod , InjectService injectService ) {
327+ final var parameterTypes = injectionMethod .getParameterTypes ();
328+ if ( injectionMethod .getParameterCount () != 1 ) {
329+ throw new ServiceDependencyException (
330+ "Encountered @InjectService on method with unexpected number of parameters"
331+ );
332+ }
333+
334+ final var dependentServiceRole = injectService .serviceRole ();
335+ if ( dependentServiceRole == null
336+ || Void .class .equals ( dependentServiceRole ) // old default value
337+ || Service .class .equals ( dependentServiceRole ) ) { // new default value
338+ return (Class <? extends Service >) parameterTypes [0 ];
339+ }
340+ else {
341+ return dependentServiceRole ;
342+ }
343+ }
344+
336345 @ Override
337346 public <R extends Service > void startService (ServiceBinding <R > serviceBinding ) {
338347 if ( serviceBinding .getService () instanceof Startable startable ) {
0 commit comments