BeetlSqlBeanRegister入口
public class BeetlSqlBeanRegister
implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, EnvironmentAware {
private ResourceLoader resourceLoader;
Environment env;
// ApplicationContext applicationContext;
BeetlSqlConfig beetlSqlConfig ;
@Override
public void setResourceLoader(ResourceLoader resourceLoader) {
this.resourceLoader = resourceLoader;
}
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
beetlSqlConfig = new BeetlSqlConfig(env);
this.readySqlManager(registry);
}
}
BeetlSqlBeanRegister继承ImportBeanDefinitionRegistrar、ResourceLoaderAware、EnvironmentAware。
EnvironmentAware获取项目配置文件信息Environment。
ResourceLoaderAware获取资源加载器,在实际的开发中,我们却经常要用到Spring容器本身的功能资源,所以Spring容器中的Bean此时就要意识到Spring容器的存在才能调用Spring所提供的资源。我们通过Spring提供的一系列接口Spring Aware来实现具体的功能。
下面是Spring所提供的Aware接口:
BeanNameAware 获得到容器中Bean的名称
BeanFactoryAware 获得当前bean Factory,从而调用容器的服务
ApplicationContextAware 当前的application context从而调用容器的服务
MessageSourceAware 得到message source从而得到文本信息
ApplicationEventPublisherAware 应用时间发布器,用于发布事件
ResourceLoaderAware 获取资源加载器,可以获得外部资源文件
ImportBeanDefinitionRegistrar实现向Spring容器中注册bean实例
方法调用栈
org.beetl.sql.starter.BeetlSqlBeanRegister#registerBeanDefinitions->readySqlManager->registerSQLManager
BeetlSqlClassPathScanner#scan->doScan->processBeanDefinitions
void processBeanDefinitions(Set<BeanDefinitionHolder> beanDefinitions) {
GenericBeanDefinition definition;
for (BeanDefinitionHolder holder : beanDefinitions) {
logger.debug(holder.toString());
definition = (GenericBeanDefinition) holder.getBeanDefinition();
String mapperClassName = definition.getBeanClassName();
// 必须在这里加入泛型限定,要不然在spring下会有循环引用的问题
definition.getConstructorArgumentValues().addGenericArgumentValue(mapperClassName);
definition.getPropertyValues().add("mapperInterface", mapperClassName);
// 根据工厂的名称创建出SqlManager
definition.getPropertyValues().add("sqlManager", new RuntimeBeanReference(this.sqlManagerFactoryBeanName));
definition.setBeanClass(BeetlSqlMapperFactoryBean.class);
// 设置Mapper按照接口组装
definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
if (logger.isDebugEnabled()) {
logger.debug("已开启BeetSql自动按照类型注入 '" + holder.getBeanName() + "'.");
}
}
}
通过设置BeetlSqlMapperFactoryBean实现了mapper bean的代理注入到spring容器。
参考文章 Spring中的ResourceLoaderAware小知识
【Spring注解驱动开发】在@Import注解中使用ImportBeanDefinitionRegistrar向容器中注册bean