beetlsql对怎么实现对mapper进行代理的

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

Spring 的类扫描器分析 - ClassPathBeanDefinitionScanner

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值