目录
一:原有xml方式
第三方框架整合, 依然使用MyBatis作为整合对象, 之前我们已经使用xml方式整合了MyBatis, 现在使用注解方式 无非就是将xml标签替换为注解, 将xml配置文件替换为配置类而已, 原有xml方式整合配置如下:
<!--配置数据源--->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="1234"></property>
</bean>
<!--配置sqlSessionFactoryBean-->
<bean class="org.mybatis.spring.sqlsessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置Mapper包扫描-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.tangyuan.dao"></property>
</bean>
@Configuration //标注当前类是一个配置类(替代配置文件)+@Component
//<context:component-scan base-package="com.itheima"/>
@ComponentScan("com.tangyuan")
//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
//<import resource=""></import>
@Import(OtherBean.class)
//3/Mapper的接口扫描
@MapperScan("com.tangyuan.mapper")
public class SpringConfig {
<!--1.配置数据源--->
@Bean
public 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;
}
<!--2.配置sqlSessionFactoryBean-->
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
}
-------jdbc.properties代码----------
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=1234
二:注解方式
Spring与MyBatis注解方式整合有个重要的技术点就是@Import, 第三方框架与Spring整合xml方式很多是凭借自定义标签完成的, 而第三方框架与Spring整合注解方式很多是靠@Import注解完成的。 @Import可以导入如下三种类:
-
普通的配置类
-
实现ImportSelector接口的类
-
实现ImportBeanDefinitionRegistrar接口的类
<!---实现ImportSelector接口的类--->
@Import({MyImportSelector.class})
<!--实现ImportBeanDefinitionRegistrar接口的类-->
//@Import(MyImportBeanDefinitionRegistrar.class)
public class SpringConfig {
}
MyImportSelector.class
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports(AnnotationMetadata annotationMetadata) {
//参数annotationMetadata叫做注解媒体数组,该对象内部封装是当前使用了@Import注解的类上的其他注解的元信息
Map<String, Object> annotationAttributes = annotationMetadata.getAnnotationAttributes(ComponentScan.class.getName());
String[] basePackages = (String[]) annotationAttributes.get("basePackages");
System.out.println(basePackages[0]);
//返回的数组封装是需要被注册到Spring容器中的Bean的全限定名
return new String[]{OtherBean2.class.getName()};
}
}
public class OtherBean2 {
}
MyImportBeanDefinitionRegistrar.class
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
//注册BeanDefinition
BeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClassName(OtherBean2.class.getName());
registry.registerBeanDefinition("otherBean2",beanDefinition);
}
}