@@ -65,7 +65,7 @@ public class SpringBeansShouldBeAccessibleCheck extends IssuableSubscriptionVisi
6565 };
6666
6767 private static final String COMPONENT_SCAN_ANNOTATION = "org.springframework.context.annotation.ComponentScan" ;
68- private static final Set <String > COMPONENT_SCAN_ARGUMENTS = SetUtils .immutableSetOf ("basePackages" , "basePackageClasses" , "value" );
68+ private static final Set <String > COMPONENT_SCAN_BASE_ARGUMENTS = SetUtils .immutableSetOf ("basePackages" , "basePackageClasses" , "value" );
6969
7070 private static final String CACHE_KEY_PREFIX = "java:S4605:targeted:" ;
7171
@@ -117,16 +117,17 @@ public void visitNode(Tree tree) {
117117 String classPackageName = packageNameOf (classTree .symbol ());
118118 SymbolMetadata classSymbolMetadata = classTree .symbol ().metadata ();
119119
120-
121- List <SymbolMetadata .AnnotationValue > componentScanValues = classSymbolMetadata .valuesForAnnotation (COMPONENT_SCAN_ANNOTATION );
122- if (componentScanValues != null ) {
123- componentScanValues .forEach (this ::addToScannedPackages );
124- } else if (hasAnnotation (classSymbolMetadata , SpringUtils .SPRING_BOOT_APP_ANNOTATION )) {
125- var targetedPackages = targetedPackages (classPackageName , classSymbolMetadata );
126- packagesScannedBySpringAtProjectLevel .addAll (targetedPackages );
127- packagesScannedBySpringAtFileLevel .addAll (targetedPackages );
128- } else if (hasAnnotation (classSymbolMetadata , SPRING_BEAN_ANNOTATIONS )) {
129- addMessageToMap (classPackageName , classTree .simpleName ());
120+ // try to apply "direct" annotation first
121+ if (!handledByComponentScan (classSymbolMetadata )) {
122+ if (hasAnnotation (classSymbolMetadata , SpringUtils .SPRING_BOOT_APP_ANNOTATION )) {
123+ // apply scan setting from @SpringBootApplication annotation
124+ var targetedPackages = targetedPackages (classPackageName , classSymbolMetadata );
125+ packagesScannedBySpringAtProjectLevel .addAll (targetedPackages );
126+ packagesScannedBySpringAtFileLevel .addAll (targetedPackages );
127+ } else if (hasAnnotation (classSymbolMetadata , SPRING_BEAN_ANNOTATIONS )) {
128+ // include this class as a candidate for issue reporting
129+ addMessageToMap (classPackageName , classTree .simpleName ());
130+ }
130131 }
131132 }
132133
@@ -145,6 +146,20 @@ public void leaveFile(JavaFileScannerContext context) {
145146 packagesScannedBySpringAtFileLevel .clear ();
146147 }
147148
149+ private boolean handledByComponentScan (SymbolMetadata classSymbolMetadata ) {
150+ boolean handledByComponentScan = false ;
151+ List <SymbolMetadata .AnnotationValue > componentScanAttributes = classSymbolMetadata .valuesForAnnotation (COMPONENT_SCAN_ANNOTATION );
152+ if (componentScanAttributes != null ) {
153+ List <SymbolMetadata .AnnotationValue > componentScanBaseAttributes = componentScanAttributes .stream ().filter (v -> COMPONENT_SCAN_BASE_ARGUMENTS .contains (v .name ())).toList ();
154+ if (!componentScanBaseAttributes .isEmpty ()) {
155+ handledByComponentScan = true ;
156+ componentScanBaseAttributes .forEach (this ::addToScannedPackages );
157+ }
158+ }
159+
160+ return handledByComponentScan ;
161+ }
162+
148163 private static String cacheKey (InputFile inputFile ) {
149164 return CACHE_KEY_PREFIX + inputFile .key ();
150165 }
@@ -200,9 +215,6 @@ private void addMessageToMap(String classPackageName, IdentifierTree classNameTr
200215 }
201216
202217 private void addToScannedPackages (SymbolMetadata .AnnotationValue annotationValue ) {
203- if (!COMPONENT_SCAN_ARGUMENTS .contains (annotationValue .name ())) {
204- return ;
205- }
206218 if (annotationValue .value () instanceof Object [] objects ) {
207219 for (Object o : objects ) {
208220 if (o instanceof String oString ) {
0 commit comments