The relationship between generic mapper and mybatis-spring and its similar spring-data-jpa
Integrating things into the framework is to rewrite the interface class of the integrated framework:
public class MapperScannerConfigurer
extends org.mybatis.spring.mapper.MapperScannerConfigurer
It can be seen from this that spring-mybatis has the ability to generate a proxy implementation class for mapper, so the general mapper is the omission of the single-table operation.
Generation is mybatis-generator
spring-data-jpa:
Generate code + proxy + single table operation is omitted
<jpa:repositories base-package="com.esteel.web.dao"></jpa:repositories>
ClassPathBeanDefinitionScanner:
private BeanNameGenerator beanNameGenerator = new AnnotationBeanNameGenerator();///When the breakpoint is interrupted, I don't know what is the implementation class of the interface. Look at the place injected earlier
protected Set<BeanDefinitionHolder> doScan(String... basePackages) {
Assert.notEmpty(basePackages, "At least one base package must be specified");
Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<BeanDefinitionHolder>();
for (String basePackage : basePackages) {////////////////// There can be multiple packages
Set<BeanDefinition> candidates = findCandidateComponents(basePackage);//////////////////////////////Get a mapper
for (BeanDefinition candidate : candidates) {
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(candidate);
candidate.setScope(scopeMetadata.getScopeName());
String beanName = this.beanNameGenerator.generateBeanName(candidate, this.registry);///When the breakpoint is interrupted, I don't know which implementation class of the interface is used. Look at the previous injection.
if (candidate instanceof AbstractBeanDefinition) {
postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName);
}
if (candidate instanceof AnnotatedBeanDefinition) {
AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate);
}
if (checkCandidate(beanName, candidate)) {
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(candidate, beanName);
definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
beanDefinitions.add(definitionHolder);//////////////All mappers are added to this set
registerBeanDefinition(definitionHolder, this.registry);
}
}
}
return beanDefinitions;
}