spring+mybatis使用MapperScannerConfigurer簡化配置


MyBatis的一大亮點就是可以不用DAO層的實現類,而我們知道service層調dao層

如果沒有實現類,Spring如何為Service注入DAO的實例呢?

比如

現在有一個dao層的bookmapper和配置mybatis的xml類

 

mybatis-config.xml也配置好了mapper

 

 

 並且有了一個Book的pojo類

 

Bookmapper.xml

 

 

我們的service 層有一個bookservice和實現類

 

 

 問題來了,現在spring容器里啥都沒有甚至度沒有spring,我們的bookserviceImpl應該注入啥

 

 當然后面的service層spring-service.xml的配置還是有的

   <!--BookServiceImpl注入到IOC容器中-->
    <bean id="BookServiceImpl" class="com.yj.service.BookServiceImpl">
        <property name="bookMapper" ref="bookMapper"/>
    </bean>

這樣控制層調用業務層是沒問題的

如conreoller包下面的BookController

import java.util.List;

@Controller
@RequestMapping("/book")
public class BookController {

    @Autowired
    @Qualifier("BookServiceImpl")
    private BookService bookService;

    @RequestMapping("/allBook")
    public String list(Model model) {
        List<Books> list = bookService.findAllBook();
        model.addAttribute("list", list);
        return "allBook";

 

關鍵是沒有dao層的bean豆子整個過程,所以一定會出錯,所以就出現MapperScannerConfigurer 

---------------------------------------------------------------------------------------------------------

Mybatis MapperScannerConfigurer 自動掃描 將Mapper接口(也就是本文用的dao層下面的BookMapper)生成代理注入到Spring

 

原理是

Mybatis在與Spring集成的時候可以配置MapperFactoryBean來生成Mapper接口的代理. 例如

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
  <property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>

MapperFactoryBean 創建的代理類實現了 UserMapper 接口,並且注入到應用程序中。 因為代理創建在運行時環境中(Runtime,譯者注) ,那么指定的映射器必須是一個接口,而 不是一個具體的實現類。

上面的配置有一個很大的缺點,就是系統有很多的配置文件時 全部需要手動編寫,所以上述的方式已經很用了。

沒有必要在 Spring 的 XML 配置文件中注冊所有的映射器。相反,你可以使用一個 MapperScannerConfigurer , 它 將 會 查 找 類 路 徑 下 的 映 射 器 並 自 動 將 它 們 創 建 成 MapperFactoryBean。

 

或者這樣理解原理

MyBatis-Spring提供了一個MapperFactoryBean,可以將數據映射接口轉為Spring Bean。

<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean">
  <property name="mapperInterface" value="dao.UserMapper"/>
  <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
 </bean>

果數據映射接口很多的話,需要在Spring的配置文件中對數據映射接口做配置,相應的配置項會很多了。為了簡化配置,在MyBatis-Spring中提供了一個轉換器MapperScannerConfig它可以將接口轉換為Spring容器中的Bean,在Service中@Autowired的方法直接注入接口實例。在Spring的配置文件中可以采用以下所示的配置將接口轉化為Bean。

<!--  sqlSessionFactory 工廠 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource" />
<!--        綁定mybatis的配置文件還可以在這(可要可不要),甚至可以和配置文件對應,或者刪除點它或者用他的許多方法-->
        <property name="configLocation" value="classpath:MyBatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/yang/mapper/UserMapper.xml"/>
    </bean>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM