• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

TAKETODAY / today-infrastructure / 18154768944

01 Oct 2025 07:26AM UTC coverage: 81.882% (-0.005%) from 81.887%
18154768944

push

github

web-flow
Merge pull request #290 from TAKETODAY/dev/jspecify

jspecify

59788 of 78013 branches covered (76.64%)

Branch coverage included in aggregate %.

141239 of 167496 relevant lines covered (84.32%)

3.6 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.0
today-context/src/main/java/infra/context/aot/RuntimeHintsBeanFactoryInitializationAotProcessor.java
1
/*
2
 * Copyright 2017 - 2025 the original author or authors.
3
 *
4
 * This program is free software: you can redistribute it and/or modify
5
 * it under the terms of the GNU General Public License as published by
6
 * the Free Software Foundation, either version 3 of the License, or
7
 * (at your option) any later version.
8
 *
9
 * This program is distributed in the hope that it will be useful,
10
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
 * GNU General Public License for more details.
13
 *
14
 * You should have received a copy of the GNU General Public License
15
 * along with this program. If not, see [https://www.gnu.org/licenses/]
16
 */
17

18
package infra.context.aot;
19

20
import org.jspecify.annotations.Nullable;
21

22
import java.util.LinkedHashMap;
23
import java.util.LinkedHashSet;
24
import java.util.Map;
25
import java.util.Set;
26

27
import infra.aot.generate.GenerationContext;
28
import infra.aot.hint.RuntimeHints;
29
import infra.aot.hint.RuntimeHintsRegistrar;
30
import infra.beans.BeanUtils;
31
import infra.beans.factory.aot.AotServices;
32
import infra.beans.factory.aot.BeanFactoryInitializationAotContribution;
33
import infra.beans.factory.aot.BeanFactoryInitializationAotProcessor;
34
import infra.beans.factory.aot.BeanFactoryInitializationCode;
35
import infra.beans.factory.config.ConfigurableBeanFactory;
36
import infra.context.annotation.ImportRuntimeHints;
37
import infra.logging.Logger;
38
import infra.logging.LoggerFactory;
39

40
/**
41
 * {@link BeanFactoryInitializationAotProcessor} implementation that processes
42
 * {@link RuntimeHintsRegistrar} implementations declared as
43
 * {@code today.strategies} or using
44
 * {@link ImportRuntimeHints @ImportRuntimeHints} annotated configuration
45
 * classes or bean methods.
46
 *
47
 * @author Brian Clozel
48
 * @author Sebastien Deleuze
49
 * @author Juergen Hoeller
50
 * @author <a href="https://github.com/TAKETODAY">Harry Yang</a>
51
 * @since 4.0
52
 */
53
class RuntimeHintsBeanFactoryInitializationAotProcessor implements BeanFactoryInitializationAotProcessor {
3✔
54

55
  private static final Logger logger = LoggerFactory.getLogger(RuntimeHintsBeanFactoryInitializationAotProcessor.class);
4✔
56

57
  @Override
58
  public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableBeanFactory beanFactory) {
59
    Map<Class<? extends RuntimeHintsRegistrar>, RuntimeHintsRegistrar> registrars = AotServices
1✔
60
            .factories(beanFactory.getBeanClassLoader()).load(RuntimeHintsRegistrar.class).stream()
8✔
61
            .collect(LinkedHashMap::new, (map, item) -> map.put(item.getClass(), item), Map::putAll);
10✔
62
    extractFromBeanFactory(beanFactory)
5✔
63
            .forEach(registrarClass -> registrars.computeIfAbsent(registrarClass, BeanUtils::newInstance));
7✔
64
    return new RuntimeHintsRegistrarContribution(registrars.values(), beanFactory.getBeanClassLoader());
8✔
65
  }
66

67
  private Set<Class<? extends RuntimeHintsRegistrar>> extractFromBeanFactory(ConfigurableBeanFactory beanFactory) {
68
    Set<Class<? extends RuntimeHintsRegistrar>> registrarClasses = new LinkedHashSet<>();
4✔
69
    for (String beanName : beanFactory.getBeanDefinitionNames()) {
17✔
70
      beanFactory.findAllAnnotationsOnBean(beanName, ImportRuntimeHints.class, true)
9✔
71
              .forEach(annotation -> registrarClasses.addAll(extractFromBeanDefinition(beanName, annotation)));
9✔
72
    }
73
    return registrarClasses;
2✔
74
  }
75

76
  private Set<Class<? extends RuntimeHintsRegistrar>> extractFromBeanDefinition(
77
          String beanName, ImportRuntimeHints annotation) {
78

79
    Set<Class<? extends RuntimeHintsRegistrar>> registrars = new LinkedHashSet<>();
4✔
80
    for (Class<? extends RuntimeHintsRegistrar> registrarClass : annotation.value()) {
17✔
81
      if (logger.isTraceEnabled()) {
3!
82
        logger.trace("Loaded [{}] registrar from annotated bean [{}]",
×
83
                registrarClass.getCanonicalName(), beanName);
×
84
      }
85
      registrars.add(registrarClass);
4✔
86
    }
87
    return registrars;
2✔
88
  }
89

90
  static class RuntimeHintsRegistrarContribution implements BeanFactoryInitializationAotContribution {
91

92
    private final Iterable<RuntimeHintsRegistrar> registrars;
93

94
    @Nullable
95
    private final ClassLoader beanClassLoader;
96

97
    RuntimeHintsRegistrarContribution(Iterable<RuntimeHintsRegistrar> registrars,
98
            @Nullable ClassLoader beanClassLoader) {
2✔
99
      this.registrars = registrars;
3✔
100
      this.beanClassLoader = beanClassLoader;
3✔
101
    }
1✔
102

103
    @Override
104
    public void applyTo(GenerationContext generationContext,
105
            BeanFactoryInitializationCode beanFactoryInitializationCode) {
106

107
      RuntimeHints hints = generationContext.getRuntimeHints();
3✔
108
      this.registrars.forEach(registrar -> {
6✔
109
        if (logger.isTraceEnabled()) {
3!
110
          logger.trace("Processing RuntimeHints contribution from [{}]",
×
111
                  registrar.getClass().getCanonicalName());
×
112
        }
113
        registrar.registerHints(hints, this.beanClassLoader);
5✔
114
      });
1✔
115
    }
1✔
116
  }
117

118
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc