当前位置: 首页 > 网络应用技术

原理分析:@mapperscacn(如何初始化弹簧启动中的映射层并注册到弹簧容器)

时间:2023-03-08 12:48:50 网络应用技术

  根据 @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

  民众 t getmapper(班级 类型 {{

  返回getConfiguration()。getMapper(type,this);

  }

  // configuration.java

  民众 t getmapper(班级 类型,sqlsession sqlsession){

  返回this.mapperrigization.getMapper(type,sqlsession);

  }

  // mapperregitive.java

  民众 t getmapper(班级 类型,sqlsession sqlsession){

  mapperproxyfactory mapperproxyfactory =(mapperproxyfactory)this.knownmappers.get(type);

  if(mapperproxyfactory == null){

  抛出新的bindingException(“ type” + type +“ bapperregization不知道。”);

  } 别的 {

  尝试 {

  返回mapperproxyfactory.newinstance(sqlsession);

  } catch(异常var5){

  抛出新的bindingException(“获取映射实例。CAUER:” + var5,var5);

  }

  }

  }

  // mapperproxyfactory.java

  受保护的t newinstance(mapperproxy mapperproxy){

  返回proxy.newproxyinstance(this.mapperinterface.getClassLoader(),new class [] {this.mapperinterface},mapperproxy);

  }

  // mapperproxyfactory.java

  公共tewinstance

  mapperproxy mapperproxy = new mapperproxy(sqlsession,this.mapperinterface,this.methodcache);

  返回this.newinstance(mapperproxy);

  }