目錄
Spring整合MyBatis
原有xml方式整合配置如下
?注解方式:
@Import可以導入如下三種類
?
第三方框架是指由其他開發者或團隊開發的軟件模塊或庫,供開發者在自己的應用程序中使用。這些框架通常提供了一系列已經封裝好的功能或工具,可節省開發者的時間和精力。常見的第三方框架包括Web框架、移動應用程序開發框架、圖形界面框架、數據庫框架、游戲引擎等。開發者可以通過相應的API調用第三方框架提供的功能,從而快速地構建出自己的應用程序。
Spring整合MyBatis
原有xml方式整合配置如下
<!-- 配置SqlSessionFactoryBean,作用將SqlSessionFactory存儲到Spring容器 --><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"></property></bean><!-- 作用:掃描指定的包,產生Mapper對象存儲到Spring容器--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 掃描的包 --><property name="basePackage" value="com.xfy.mapper"></property></bean><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"></property><property name="url" value="${jdbc.url}"></property><property name="username" value="${jdbc.username}"></property><property name="password" value="${jdbc.password}"></property></bean>
?注解方式:
Spring整合MyBatis的原理,關鍵在于@MapperScan,@MapperScan不是Spring提供的注解,是MyBatis為了整合Spring,在整合包org.mybatis.annotation中提供的注釋
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({MapperScannerRegistrar.class})
@Repeatable(MapperScans.class)
public @interface MapperScan {
?
//標注當前類是一個配置類+@Component
@Configuration
@ComponentScan(basePackages ={"org.xfy"} )//basePackages是一個數組 組件掃描
@PropertySource("classpath:jdbc.properties")//用于加載外部properties資源配置,
@Import(otherBean.class)//用于加載其他配置類
@MapperScan("org.xfy.mapper")//接口掃描
public class SpringConfig {@Beanpublic DataSource dataSource(@Value("${jdbc.driver}") String driver,@Value("${jdbc.url}") String url,@Value("${jdbc.username}") String username,@Value("${jdbc.password}") String password){DruidDataSource dataSource=new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);return sqlSessionFactoryBean;}
Spring與MyBatis注解方式整合有個重要的技術點就是@Import,第三方框架與Spring整合xml方式很多是憑借自定義標簽完成的,而第三方框架與Spring整合注解方式很多是靠@Import完成的
@Import可以導入如下三種類
-
普通的配置類
-
實現ImportSelector接口的類
package org.xfy.imports;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
import org.xfy.beans.otherBean;
import org.xfy.beans.otherBean2;import java.util.Map;
import java.util.function.Predicate;public class MyImportSelect implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {//AnnotationMetadata叫做注釋媒體數組,該對象內部封裝的是當前使用了@import注解的類上的其他注解的源形象Map<String, Object> annotationAttributes = annotationMetadata.getAnnotationAttributes(ComponentScan.class.getName());//返回的數組封裝的是需要被注冊到Spring容器中的Bean的全限定名return new String[]{otherBean2.class.getName()};}}
?
實現ImportBeanDefinitionRegister接口的類
package org.xfy.imports;import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.xfy.beans.otherBean2;public class MyImporBeanDefinitionRegisart implements ImportBeanDefinitionRegistrar
{@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {//注冊Bean DefinitionBeanDefinition beanDefinition=new RootBeanDefinition();beanDefinition.setBeanClassName(otherBean2.class.getName());registry.registerBeanDefinition("otherBean2",beanDefinition);}