49
49
import org .springframework .core .annotation .MergedAnnotations .SearchStrategy ;
50
50
import org .springframework .core .env .Environment ;
51
51
import org .springframework .util .Assert ;
52
+ import org .springframework .util .ClassUtils ;
52
53
import org .springframework .util .CollectionUtils ;
53
54
import org .springframework .util .LinkedMultiValueMap ;
54
55
import org .springframework .util .MultiValueMap ;
@@ -140,8 +141,9 @@ private Collection<EndpointBean> createEndpointBeans() {
140
141
}
141
142
142
143
private EndpointBean createEndpointBean (String beanName ) {
143
- Object bean = this .applicationContext .getBean (beanName );
144
- return new EndpointBean (this .applicationContext .getEnvironment (), beanName , bean );
144
+ Class <?> beanType = ClassUtils .getUserClass (this .applicationContext .getType (beanName , false ));
145
+ Supplier <Object > beanSupplier = () -> this .applicationContext .getBean (beanName );
146
+ return new EndpointBean (this .applicationContext .getEnvironment (), beanName , beanType , beanSupplier );
145
147
}
146
148
147
149
private void addExtensionBeans (Collection <EndpointBean > endpointBeans ) {
@@ -159,8 +161,9 @@ private void addExtensionBeans(Collection<EndpointBean> endpointBeans) {
159
161
}
160
162
161
163
private ExtensionBean createExtensionBean (String beanName ) {
162
- Object bean = this .applicationContext .getBean (beanName );
163
- return new ExtensionBean (this .applicationContext .getEnvironment (), beanName , bean );
164
+ Class <?> beanType = ClassUtils .getUserClass (this .applicationContext .getType (beanName ));
165
+ Supplier <Object > beanSupplier = () -> this .applicationContext .getBean (beanName );
166
+ return new ExtensionBean (this .applicationContext .getEnvironment (), beanName , beanType , beanSupplier );
164
167
}
165
168
166
169
private void addExtensionBean (EndpointBean endpointBean , ExtensionBean extensionBean ) {
@@ -233,7 +236,8 @@ private void assertNoDuplicateOperations(EndpointBean endpointBean, MultiValueMa
233
236
}
234
237
235
238
private boolean isExtensionExposed (EndpointBean endpointBean , ExtensionBean extensionBean ) {
236
- return isFilterMatch (extensionBean .getFilter (), endpointBean ) && isExtensionExposed (extensionBean .getBean ());
239
+ return isFilterMatch (extensionBean .getFilter (), endpointBean )
240
+ && isExtensionTypeExposed (extensionBean .getBeanType ());
237
241
}
238
242
239
243
/**
@@ -242,10 +246,21 @@ private boolean isExtensionExposed(EndpointBean endpointBean, ExtensionBean exte
242
246
* @param extensionBean the extension bean
243
247
* @return {@code true} if the extension is exposed
244
248
*/
249
+ @ Deprecated
245
250
protected boolean isExtensionExposed (Object extensionBean ) {
246
251
return true ;
247
252
}
248
253
254
+ /**
255
+ * Determine if an extension bean should be exposed. Subclasses can override this
256
+ * method to provide additional logic.
257
+ * @param extensionBeanType the extension bean type
258
+ * @return {@code true} if the extension is exposed
259
+ */
260
+ protected boolean isExtensionTypeExposed (Class <?> extensionBeanType ) {
261
+ return true ;
262
+ }
263
+
249
264
private boolean isEndpointExposed (EndpointBean endpointBean ) {
250
265
return isFilterMatch (endpointBean .getFilter (), endpointBean ) && !isEndpointFiltered (endpointBean )
251
266
&& isEndpointExposed (endpointBean .getBean ());
@@ -257,10 +272,21 @@ private boolean isEndpointExposed(EndpointBean endpointBean) {
257
272
* @param endpointBean the endpoint bean
258
273
* @return {@code true} if the endpoint is exposed
259
274
*/
275
+ @ Deprecated
260
276
protected boolean isEndpointExposed (Object endpointBean ) {
261
277
return true ;
262
278
}
263
279
280
+ /**
281
+ * Determine if an endpoint bean should be exposed. Subclasses can override this
282
+ * method to provide additional logic.
283
+ * @param beanType the endpoint bean type
284
+ * @return {@code true} if the endpoint is exposed
285
+ */
286
+ protected boolean isEndpointTypeExposed (Class <?> beanType ) {
287
+ return true ;
288
+ }
289
+
264
290
private boolean isEndpointFiltered (EndpointBean endpointBean ) {
265
291
for (EndpointFilter <E > filter : this .filters ) {
266
292
if (!isFilterMatch (filter , endpointBean )) {
@@ -272,7 +298,7 @@ private boolean isEndpointFiltered(EndpointBean endpointBean) {
272
298
273
299
@ SuppressWarnings ("unchecked" )
274
300
private boolean isFilterMatch (Class <?> filter , EndpointBean endpointBean ) {
275
- if (!isEndpointExposed (endpointBean .getBean ())) {
301
+ if (!isEndpointTypeExposed (endpointBean .getBeanType ())) {
276
302
return false ;
277
303
}
278
304
if (filter == null ) {
@@ -392,7 +418,9 @@ private static class EndpointBean {
392
418
393
419
private final String beanName ;
394
420
395
- private final Object bean ;
421
+ private final Class <?> beanType ;
422
+
423
+ private final Supplier <Object > beanSupplier ;
396
424
397
425
private final EndpointId id ;
398
426
@@ -402,17 +430,18 @@ private static class EndpointBean {
402
430
403
431
private Set <ExtensionBean > extensions = new LinkedHashSet <>();
404
432
405
- EndpointBean (Environment environment , String beanName , Object bean ) {
406
- MergedAnnotation <Endpoint > annotation = MergedAnnotations
407
- .from ( bean . getClass (), SearchStrategy . TYPE_HIERARCHY ). get (Endpoint .class );
433
+ EndpointBean (Environment environment , String beanName , Class <?> beanType , Supplier < Object > beanSupplier ) {
434
+ MergedAnnotation <Endpoint > annotation = MergedAnnotations . from ( beanType , SearchStrategy . TYPE_HIERARCHY )
435
+ .get (Endpoint .class );
408
436
String id = annotation .getString ("id" );
409
437
Assert .state (StringUtils .hasText (id ),
410
- () -> "No @Endpoint id attribute specified for " + bean . getClass () .getName ());
438
+ () -> "No @Endpoint id attribute specified for " + beanType .getName ());
411
439
this .beanName = beanName ;
412
- this .bean = bean ;
440
+ this .beanType = beanType ;
441
+ this .beanSupplier = beanSupplier ;
413
442
this .id = EndpointId .of (environment , id );
414
443
this .enabledByDefault = annotation .getBoolean ("enableByDefault" );
415
- this .filter = getFilter (this . bean . getClass () );
444
+ this .filter = getFilter (beanType );
416
445
}
417
446
418
447
void addExtension (ExtensionBean extensionBean ) {
@@ -432,8 +461,12 @@ String getBeanName() {
432
461
return this .beanName ;
433
462
}
434
463
464
+ Class <?> getBeanType () {
465
+ return this .beanType ;
466
+ }
467
+
435
468
Object getBean () {
436
- return this .bean ;
469
+ return this .beanSupplier . get () ;
437
470
}
438
471
439
472
EndpointId getId () {
@@ -457,17 +490,20 @@ private static class ExtensionBean {
457
490
458
491
private final String beanName ;
459
492
460
- private final Object bean ;
493
+ private final Class <?> beanType ;
494
+
495
+ private final Supplier <Object > beanSupplier ;
461
496
462
497
private final EndpointId endpointId ;
463
498
464
499
private final Class <?> filter ;
465
500
466
- ExtensionBean (Environment environment , String beanName , Object bean ) {
467
- this .bean = bean ;
501
+ ExtensionBean (Environment environment , String beanName , Class <?> beanType , Supplier <Object > beanSupplier ) {
468
502
this .beanName = beanName ;
503
+ this .beanType = beanType ;
504
+ this .beanSupplier = beanSupplier ;
469
505
MergedAnnotation <EndpointExtension > extensionAnnotation = MergedAnnotations
470
- .from (bean . getClass () , SearchStrategy .TYPE_HIERARCHY ).get (EndpointExtension .class );
506
+ .from (beanType , SearchStrategy .TYPE_HIERARCHY ).get (EndpointExtension .class );
471
507
Class <?> endpointType = extensionAnnotation .getClass ("endpoint" );
472
508
MergedAnnotation <Endpoint > endpointAnnotation = MergedAnnotations
473
509
.from (endpointType , SearchStrategy .TYPE_HIERARCHY ).get (Endpoint .class );
@@ -481,8 +517,12 @@ String getBeanName() {
481
517
return this .beanName ;
482
518
}
483
519
520
+ Class <?> getBeanType () {
521
+ return this .beanType ;
522
+ }
523
+
484
524
Object getBean () {
485
- return this .bean ;
525
+ return this .beanSupplier . get () ;
486
526
}
487
527
488
528
EndpointId getEndpointId () {
0 commit comments