目录
需求
标题有些许拗口
简单来说,就是实现mybatis框架中的MapperScan功能(接口扫描与代理对象注册)。
在Spring环境中,我们常通过XML文件 或者 @Controller、@Component、@Service、@Bean等注解进行bean的注册。
这么做比较简单便捷,但同时我们自己的代码与服务与Spring框架紧密耦合,只要SpringBoot启动,我们的类就会被加载、注册进容器,无法进行策略的替换。
比如某个场景下,我需要注册package1中的bean;另一个场景下,我需要注册package2中的bean。
当然,用SpringBoot神奇的@Conditional注解,也可以达到条件注册的目的。但这种方法不符合“批量”这一特征。
在Mybatis中也有类似的需求。Mybatis与SpringBoot集成时,Mapper接口(其实注入容器的是代理对象)是如何被批量注册进Bean容器的?
通过MapperScan注解指定包名,将该包下的所有类加载到内存中,生成代理对象后注册进spring容器。
源码有兴趣的可以自己阅读一下,下面仿造mybatis写一个bean批量注册的功能。
实现
项目结构
大概结构如下

待注入类
listener包下有两个测试类,是我们需要注入的对象。
UserInfo无关紧要,只是用来测试Autowired注解后续能否生效的,忽略即可。
public class HelloListener {
@Autowired
UserInfo userInfo;
public void hello() {
System.out.println("hello");
}
}
public class WorldListener {
public void world() {
System.out.println("world");
}
}
ClassScanner工具类
比较关键的工具类,用于加载指定package下的class
public class ClassScanner {
private final String packageName;
private final String packageUrl;
private final ClassLoader classLoader;
private final Charset charset;
private final Set<Class<?>> classes = new HashSet<>();
public ClassScanner(String packageName, ClassLoader classLoader) {
this.packageName = packageName;
this.cl

本文档展示了如何模仿Mybatis的MapperScan功能,实现在Spring环境中批量注册Bean。通过创建自定义注解@ListenerScan,配合ClassScanner工具类扫描指定包下的类,并使用BeanDefinitionRegister实现Bean的注册。最终,即使不使用@Component等注解,也能将类注册到Spring容器中。
最低0.47元/天 解锁文章
3753

被折叠的 条评论
为什么被折叠?



