序
本文主要研究一下langchain4j-spring-boot-starter的AiServicesAutoConfig
LangChain4jAutoConfig
dev/langchain4j/spring/LangChain4jAutoConfig.java
@AutoConfiguration
@Import({
AiServicesAutoConfig.class,
RagAutoConfig.class,
AiServiceScannerProcessor.class
})
public class LangChain4jAutoConfig {
}
LangChain4jAutoConfig自动import了AiServicesAutoConfig、RagAutoConfig、AiServiceScannerProcessor
AiServiceScannerProcessor
dev/langchain4j/service/spring/AiServiceScannerProcessor.java
@Component
public class AiServiceScannerProcessor implements BeanDefinitionRegistryPostProcessor, EnvironmentAware {
private Environment environment;
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
ClassPathAiServiceScanner scanner = new ClassPathAiServiceScanner(registry, false);
Set<String> basePackages = getBasePackages((ConfigurableListableBeanFactory) registry);
scanner.scan(StringUtils.toStringArray(basePackages));
removeAiServicesWithInactiveProfiles(registry);
}
private Set<String> getBasePackages(ConfigurableListableBeanFactory beanFactory) {
Set<String> basePackages = new LinkedHashSet<>();
// AutoConfiguration
List<String> autoConfigPackages = AutoConfigurationPackages.get(beanFactory);
basePackages.addAll(autoConfigPackages);
// ComponentScan
addComponentScanPackages(beanFactory, basePackages);
return basePackages;
}
private void addComponentScanPackages(ConfigurableListableBeanFactory beanFactory, Set<String> collectedBasePackages) {
for (String beanName : beanFactory.getBeanNamesForAnnotation(ComponentScan.class)) {
Class<?> beanClass = beanFactory.getType(beanName);
if (beanClass != null) {
Set<ComponentScan> componentScans = AnnotatedElementUtils.getMergedRepeatableAnnotations(beanClass, ComponentScan.class);
for (ComponentScan componentScan : componentScans) {
Set<String> basePackages = new LinkedHashSet<>();
for (String pkg : componentScan.basePackages()) {
String[] tokenized = StringUtils.tokenizeToStringArray(this.environment.resolvePlaceholders(pkg),
ConfigurableApplicationContext.CONFIG_LOCATION_DELIMITERS);
Collections.addAll(basePackages, tokenized);
}
for (Class<?> clazz : componentScan.basePackageClasses()) {
basePackages.add(ClassUtils.getPackageName(clazz));
}
if (basePackages.isEmpty()) {
basePackages.add(ClassUtils.getPackageName(beanClass));
}
collectedBasePackages.addAll(basePackages);
}
}
}
}
private void removeAiServicesWithInactiveProfiles(BeanDefinitionRegistry registry) {
Arrays.stream(registry.getBeanDefinitionNames())
.filter(beanName -> {
try {
BeanDefinition beanDefinition = registry.getBeanDefinition(beanName);
if (beanDefinition.getBeanClassName() != null) {
Class<?> beanClass = Class.forName(beanDefinition.getBeanClassName());
if (beanClass.isAnnotationPresent(AiService.class)
&& beanClass.isAnnotationPresent(Profile.class)) {
Profile pr

最低0.47元/天 解锁文章
2169

被折叠的 条评论
为什么被折叠?



