根据 @Mapperscan的注释配置配置的软件包路径,扫描所有映射器接口,创建BeanDefinition对象,将BeanClass属性值修改为MapperFactoryBean,注册到Spring容器中以准备后续Bean初始化。
FactoryBean:指定FactoryBean实现类以生成接口代理类。默认值为mapperfactorybean.class,支持自定义。
该类实现ImportBeanDefinitionItInItistrar界面。启动时,注册了寄存器BeanDefinitions方法,以注册mapperscannerconfigurer.class的BeanDefinition到容器中。
关于importBeanDefinientRegistrar:弹簧扩展点之一,当启动时,它将拨打覆盖的RegisterBeanDefinins方法,以将BeanDefinition注册到容器中。
该类实现BeanDefinitionistrypostProcessor接口。BeanDefinitionRegiskPostProcessor也是弹簧的扩展点之一。回调所涵盖的后过程也是弹簧之一。ClassPathMappersCanner对象是在回调方法中创建的,Doscan(basepackages)方法被调用以扫描并在@mappersCacn中创建袋子路径,并修改BeanDefinition。
扫描映射层的所有接口,设置BeanClass和AutowireMode的定义。
// mapperfactorybean.java
@Override
public t getObject()抛出异常{
返回getsqlsession()。getMapper(this.mapperinterface);
}
// sqlsessiondaosupport.java
public sqlsession getsqlsession(){
返回this.sqlsessionTemplate;
}
// sqlsessionTemplate.java
@Override
民众
返回getConfiguration()。getMapper(type,this);
}
// configuration.java
民众
返回this.mapperrigization.getMapper(type,sqlsession);
}
// mapperregitive.java
民众
mapperproxyfactory
if(mapperproxyfactory == null){
抛出新的bindingException(“ type” + type +“ bapperregization不知道。”);
} 别的 {
尝试 {
返回mapperproxyfactory.newinstance(sqlsession);
} catch(异常var5){
抛出新的bindingException(“获取映射实例。CAUER:” + var5,var5);
}
}
}
// mapperproxyfactory.java
受保护的t newinstance(mapperproxy
返回proxy.newproxyinstance(this.mapperinterface.getClassLoader(),new class [] {this.mapperinterface},mapperproxy);
}
// mapperproxyfactory.java
公共tewinstance
mapperproxy
返回this.newinstance(mapperproxy);
}