Spring(十五)- Spring注解方式整合第三方框架
admin
2024-01-29 01:25:12
0

文章目录

  • 一、Spring注解方式整合第三方框架
    • 1. Spring注解方式整合Mybatis原理
    • 2. @Import整合第三方框架原理

一、Spring注解方式整合第三方框架

1. Spring注解方式整合Mybatis原理

第三方框架整合,依然使用MyBatis作为整合对象,之前我们已经使用xml方式整合了MyBatis,现在使用注解方式无非就是将xml标签替换为注解,将xml配置文件替换为配置类而已,原有xml方式整合配置如下:

 
   

 
 
 
 

使用@Bean将DataSource和SqlSessionFactoryBean存储到Spring容器中,而MapperScannerConfigurer使用注解@MapperScan进行指明需要扫描的Mapper在哪个包下,使用注解整合MyBatis配置方式如下:

@Configuration
@ComponentScan("com.itheima")
@MapperScan("com.itheima.mapper")
public class ApplicationContextConfig {@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的原理,关键在于@MapperScan,@MapperScan不是Spring提供的注解,而是MyBatis为了整合Spring,在整合包org.mybatis.spring.annotation中提供的注解,源码如下:

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({MapperScannerRegistrar.class})
@Repeatable(MapperScans.class)
public @interface MapperScan {String[] value() default {};String[] basePackages() default {};Class[] basePackageClasses() default {};Class annotationClass() default Annotation.class;// ... ...
}

重点关注一下@Import({MapperScannerRegistrar.class}),当@MapperScan被扫描加载时,会解析@Import注解,从而加载指定的类,此处就是加载了MapperScannerRegistrar

MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar接口,Spring会自动调用registerBeanDefinitions方法,该方法中又注册MapperScannerConfigurer类,而MapperScannerConfigurer类作用是扫描Mapper,向容器中注册Mapper对应的MapperFactoryBean,前面讲过,此处不在赘述了:章节地址

public class MapperScannerRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware {// 默认执行registerBeanDefinitions方法void registerBeanDefinitions(AnnotationMetadata annoMeta, AnnotationAttributes annoAttrs, BeanDefinitionRegistry registry, String beanName) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(MapperScannerConfigurer.class);// ... 省略其他代码 ...// 注册BeanDefinitionregistry.registerBeanDefinition(beanName, builder.getBeanDefinition());} 
}

2. @Import整合第三方框架原理

Spring与MyBatis注解方式整合有个重要的技术点就是@Import,第三方框架与Spring整合xml方式很多是凭借自定义标签完成的,而第三方框架与Spring整合注解方式很多是靠@Import注解完成的。
@Import可以导入如下三种类:
⚫ 普通的配置类
⚫ 实现ImportSelector接口的类
⚫ 实现ImportBeanDefinitionRegistrar接口的类

@Import导入实现了ImportSelector接口的类

@Configuration
@ComponentScan("com.itheima")
@Import({MyImportSelector.class})public class ApplicationContextConfig {
}
public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {// 返回要进行注册的Bean的全限定名数组return new String[]{User2.class.getName()};} 
}

ImportSelector接口selectImports方法的参数AnnotationMetadata代表注解的媒体数据,可以获得当前注解修饰的类的元信息,例如:获得组件扫描的包名

public class MyImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {// 获得指定类型注解的全部信息Map annotationAttributes = annotationMetadata.getAnnotationAttributes(ComponentScan.class.getName());// 获得全部信息中basePackages信息String[] basePackages = (String[]) annotationAttributes.get("basePackages");// 打印结果是com.itheimaSystem.out.println(basePackages[0]);return new String[]{User2.class.getName()};} 
}

@Import导入实现ImportBeanDefinitionRegistrar接口的类,实现了该接口的类的registerBeanDefinitions方法会被自动调用,在该方法内可以注册BeanDefinition

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {// 使用给定的BeanDefinitionRegistry参数,手动注册BeanDefinitionBeanDefinition beanDefinition = new RootBeanDefinition();beanDefinition.setBeanClassName("com.itheima.pojo.User2");registry.registerBeanDefinition("user2", beanDefinition);} 
}

相关内容

热门资讯

宁波一游乐园内装饰树起火,工作... 7月6日,多位网友在社交平台发视频称,浙江宁波罗蒙环球乐园一棵圣诞树突然起火。 现场视频显示,一处游...
快乐不放假 公园玩一夏 全市4... 深圳新闻网2025年7月7日讯(深圳商报记者 文灿)7月5日,深圳公园“快乐不放假,公园玩一夏”夏日...
为了帮女儿照顾孩子,我和儿媳妇... 为了帮女儿照顾孩子,我和儿媳妇闹翻了01 “带着你的外孙走。” 一声尖锐的叫喊声过后,传来门被重...
孩子课上听不懂老师讲的怎么办? 孩子课上听不懂老师讲的怎么办?到外面培训机构培训一下,比如新东方教育之类的孩子刚上一年级,课上听不懂...
安徽一爸爸火车上睡着,儿子走丢... 安徽一爸爸火车上睡着,儿子走丢了都不知道,爸爸带娃到底有多靠谱?实在是太不靠谱了,这样的行为实在是太...
大家支持小学生向老师举报、告状... 大家支持小学生向老师举报、告状、告密吗?我个人不支持这样的做法,这样有个弊端,可能把孩子引向一个背后...
麻烦各位推荐几本好看的穿越小说 麻烦各位推荐几本好看的穿越小说绾青丝 独步天下 醉玲珑 丑颜倾城芊泽花,醉玲珑,跨过千年来爱你,暴...
星际战甲怎么一键分解所有重复m... 星际战甲怎么一键分解所有重复mod对着mod,按鼠标中键,即可全选该mod。按重复数量排序,即可方便...
电视剧《五星大饭店》有续集吗?... 电视剧《五星大饭店》有续集吗?是什么结局啊?没有续集。话说没有拍续集的打算。一般现在看的续集都是网友...
高中会考没过就一定没高中毕业证... 高中会考没过就一定没高中毕业证吗?高中会考没过就一定没高中毕业证吗不一定那,没过也可以领的当然不是,...
为什么我的仙剑奇侠传四玩道慕容... 为什么我的仙剑奇侠传四玩道慕容紫英那就卡掉,不能继续啊?我仙四一到紫英那放动画那就卡住,然后关闭了啊...
YES!光之美少女5GOGO有... YES!光之美少女5GOGO有哪些剧场版有YES,光之美少女剧场版1、光之美少女剧场版2、光之美少女...
住家保姆的服务内容有哪些 住家保姆的服务内容有哪些这个要跟保姆自己谈了要看你给的价格了
钓鱼坠子的制作方法有什么? 钓鱼坠子的制作方法有什么?进行海竿抛钩时,由于水底不平或水草、树根过多,挂钩失坠时有发生。因此在垂钓...
问下,图里的那个动漫人物是出自... 问下,图里的那个动漫人物是出自哪个动漫薄樱鬼斋藤一出自动漫《薄樱鬼》人物名为:斋藤一这是原图我觉得像...
死神黑崎一护是不是灭却师?第二... 死神黑崎一护是不是灭却师?第二部什么时候出?一护妈妈是灭却师,爸爸是死神,所以算个混血儿→ →也就是...
点到为止的意思 点到为止的意思点到为止:说话时只是轻轻触及话题的边缘,而不必深入谈论,但是已经让对方明了意图即可到了...
《余生请多指教》热播,顾医生身... 《余生请多指教》热播,顾医生身上有哪些特质?特别温柔,特别专一,会安慰人,会讲大道理,特别暖心。顾医...
浩态狂香昔未逢,红灯烁烁绿盘龙... 浩态狂香昔未逢,红灯烁烁绿盘龙,觉来独对情惊恐,身在仙宫第九重。韩愈的哪一首诗。名字啊什麼?顺便求诗...