這次講講Mybatis與Spring的整合,作為兩款優秀的開源框架,被大眾廣泛使用,自然是需要強強聯合的。
使用示例
先看一下怎么使用,首先需要引用這兩款框架的jar包:
<dependency>//spring-webmvc會自動去引入其他Spring的核心包<groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-jcl</artifactId><version>${spring.version}</version>
</dependency>
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version>
</dependency>
<dependency>//集成包,是Mybatis和Spring的中間橋梁<groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version>
</dependency>
在Spring的配置文件中需引入集成包的兩個類:
org.mybatis.spring.SqlSessionFactoryBean:將Mybatis的SqlSessionFactory注入到Spring的IOC容器中;
org.mybatis.spring.mapper.MapperScannerConfigurer:配置Mybatis接口以及Spring容器中的SqlSessionFactory引用;
配置示例:
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">//配置數據源的引用<property name="dataSource" ref="dataSource"></property>//配置Mybatis對的配置所在類路徑(可不配)<property name="configLocation" value="classpath:mybatis-config.xml"></property>//配置Mapper文件所在位置<property name="mapperLocations"><list><value>classpath:com/test/mybatis/dao/*.xml</value></list></property>
</bean> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">//配置DAO層接口所在位置,多個DAO路徑可用,隔開<property name="basePackage" value="com.test.mybatis.dao"></property>//配置SqlSessionFactoryBean引用名稱<property name="sqlSessionFactoryBeanName" value="sqlSessionFactoryBean"></property>
</bean>
源碼分析
Spring集成了Mybatis之后Mybatis的配置文件中的標簽配置基本可以不需要配置,都可以在Spring中的配置;
先談談這兩個類:
SqlSessionFactoryBean
Mybatis中任何屬性均在在這個類中可配置:
我們可以發現這個實現了三個接口:
FactoryBean<SqlSessionFactory>:Spring中Bean存在的一種形式;
InitializingBean:Bean的初始化方法;
ApplicationListener<ApplicationEvent>:Spring IOC容器監聽方法,分別在容器創建、關閉、刷新、停止時執行;
Bean的初始化方法:
在buildSqlSessionFactory方法中就是將Mybatis的流程加載一遍。
容器的監聽方法:
MapperScannerConfigurer
該類實現了:
BeanDefinitionRegistryPostProcessor:?BeanDefinitionRegistry的后置處理器,即在Spring容器創建時加載,可以修改Bean一些相關的信息;
InitializingBean:Bean的初始化方法:
ApplicationContextAware:上下文接口的Aware接口,可將容器中上下文對象開放;
BeanNameAware:Bean名稱Aware接口,可以修改Bean的名稱;
重點談一下以下兩個方法:
過濾器,在Spring當中能夠指定過濾某些類或注解等等,在之前的Spring的文章好像沒有談到,那就下次在說吧:
在掃描的方法中,會將掃描接口的一些Bean的屬性進行改變:
到了這里會發現將所有的接口Bean中的Class替換成MapperFactoryBean,那么這些接口所有的Class類型都是MapperFactoryBean了。
其實集成包中除了之前的兩個類之外,還有一個MapperFactoryBean對象。
MapperFactoryBean
在MapperScannerConfigurer當中將所有的接口類型全部替換成MapperFactoryBean,所以在Spring的配置文件也可以這樣配置單個接口:
<bean id="userDao" class="org.mybatis.spring.mapper.MapperFactoryBean"><property name="mapperInterface" value="com。test。mybatis。dao。UserDao"></property><property name="SqlSessionFactory" ref="sqlSessionFactoryBean"></property>
</bean>
如果接口過多,就需要配置很多MapperFactoryBean,不方便,所以一般在企業級應用中都是配置MapperScannerConfigurer。
這樣我們調用DAO的接口對象就是MapperProxy的代理對象了,就可以操作數據庫了
示例:
&將FactoryBean本身的類獲取到,之前談Spring的時候提到過。