spring+ibatis在spring配置文件中注入sqlmapclient时,一直报错,详情代码见下面

spring+ibatis在spring配置文件中注入sqlmapclient时,一直报错,详情代码见下面,第1张

spring30注入sqlMapClient的几种方式:

bean定义

<bean id="dataSource" class="orgapachecommonsdbcpBasicDataSource">

<property name="driverClassName" value="commysqljdbcDriver" />

<property name="url" value="jdbc:mysql://localhost:3306/cms" />

<property name="username" value="root" />

<property name="password" value="19860619" />

</bean>

<bean id="sqlMapClient" class="orgspringframeworkormibatisSqlMapClientFactoryBean">

<property name="configLocation">

<value>classpath:/context/ibatis/sqlMapConfigxml

</value>

</property>

<property name="dataSource">

<ref bean="dataSource" />

</property>

</bean>

a在context中装载sqlMapClient并建立sqlMapClientfactory,每次执行sql *** 作都从factory中获取sqlMapClientfactory获取bean方法:

WebApplicationContext wac = ContextLoader

getCurrentWebApplicationContext();

SqlMapClient sqlMapClient = wacgetBean("sqlMapClient",

SqlMapClientclass);

b在每个DAO中使用spring注解注入sqlMapClient:

@Autowired

@Qualifier("sqlMapClient")

private SqlMapClient sqlMapClient;

c创建BaseDao继承SqlMapClientDaoSupport,所有DAO都继承BaseDaoBaseDao中注入sqlMapClient:

@Autowired

@Qualifier("sqlMapClient")

public void setSqlMapClientForAutowired(SqlMapClient sqlMapClient) {

supersetSqlMapClient(sqlMapClient);

}

该方法实际上是使用了sqlMapclientTemplate并向template注入sqlMapClient。

在 Spring IOC(9) 里面介绍了三级缓存的时候,提到了AOP创建代理类的内容,有两个地方会去调用AbstractAutoProxyCreatorwrapIfNecessary()去创建代理类。

这里面声明了三个bean,一个真实对象RealSubject,一个Advice,还有一个ProxyFactoryBean。

三个bean创建的时机是不一样的,测试main通过getBean()创建subjectProxy,在populateBean的时候,会去创建subject对应的bean,而testAdvice是在initializeAdvisorChain的过程中通过getBean()进行实例化。

再回顾一下FactoryBean的getObject流程:

正常beanFactorygetBean("subjectProxy")创建的是ProxyFactoryBean,在populateBean的过程中,创建subject的实例,在这之后会调用getObjectForBeanInstance()方法,这里面就是Bean和FactoryBean的区别之处:

上述流程简述了利用ProxyFactoryBean来创建代理对象的过程,通过XML来演示会比较直白,下面就通过spring aop配置看看是如何创建代理对象。

环境:mybatis-spring 203

可以通过如下方式向在Spring中集成Mybatis,通过向Spring注册 SqlSessionFactoryBean 和 @MapperScan 启用Mybatis的功能

Mybatis利用Spring提供的 BeanFactory 接口,实现了 SqlSessionFactoryBean ,简单来说它就是一个构建 SqlSessionFactory 的工厂类,虽然注册的是 SqlSessionFactoryBean ,但是它生产的对象也会注册到Spring容器中

简而言之,Mybatis借助 SqlSessionFactoryBean 完成了在不集成Spring的情况下 SqlSessionFactory 的创建,同时可以借助这个类装配 Interceptor 、 TypeHandler 等组件

关于Feign的启动原理分析,参照另一篇 Spring Cloud Feign 源码分析 - feign启动原理

书接上文,上篇最后提到所有带@FeignClient注解的interface都被封装成FeignClientFactoryBean的BeanDefinition。从名字上可以得知这个类是一个FactoryBean。关于FactoryBean的介绍参考

因此直接找getObject()。

getTarget方法首先获取FeignContext的对象,基于这个context对当前feign的配置信息存放到Builder中。

首先实例化bean:FeignContext

FeignContext的定义在FeignAutoConfiguration

第一次除了创建新的FeignContext对象之外,还设置了一组configurations,

这组configurations是FeignClientSpecification类型,通过autowired注入。

在扫描EnableFeignClients和各个FeignClient时,将configuration对应的class封装成了FeignClientSpecification的BeanDefinition,这里从容器中取出来创建对象注入到configurations

通过断点可以看到这里有15个FeignClientSpecification的对象

一个是default开头的在启动类里配置的configuration,剩下的都是FeignClient的configuration。

FeignContext继承了NamedContextFactory,对应的范型就是FeignClientSpecification,看下NamedContextFactory构造方法

这里设置了默认的defaultConfigType,feign里用的是FeignClientsConfiguration,定义了一系列的默认值。

在获取到FeignContext之后,开始封装FeignBuilder。

首先通过context实例化FeignLoggerFactory的对象,因为context是NamedContextFactory的子类,会给每个contextId创建一个独立的AnnotationConfigApplicationContext上下文,每一个k-v会存储在FeignContext的全局context中,key就是contextId

这三个方法的实现完全体现了NamedContextFactory的作用:

给每个name创建一个单独的ApplicationContext子上下文对象,后续凡是这个name的ioc *** 作,都由独立的ApplicationContext来完成,name之间的context相互隔离。所有的子上下文保存在了Map<String, AnnotationConfigApplicationContext> contexts中。

在创建Context时,补充了configuration的设置:

首先(1的位置),从全局的configurations查找是否定义了只对当前name生效的configuration,也就是判断在当前name所属的FeignClient注解上是否定义了configuration。如果定义过,将这个configuration的Class封装成BeanDefinition注册到本name的子上下文中。

接着(2的位置),从全局的configurations查找是否定义了全局配置,也就是@EnableFeignClients的defaultConfiguration的值,这里固定前缀是default。

如果也存在,就也将这个defaultConfiguration的Class封装成BeanDefinition注册到本name的子上下文中。

第一次调用完毕get方法后,给每个FeignClient创建的FeignContext就完成了configuration初始化的动作,后面的所有 *** 作,如配置encoder、decoder都是给当前的子上下文内注册BeanDefinition。最后将所有配置封装成Builder返回。

在getTarget()构造完成builder属性之后,开始了整个请求调度过程。

先看第一段:

如果没有url属性,就用name来处理,把>

以上就是关于spring+ibatis在spring配置文件中注入sqlmapclient时,一直报错,详情代码见下面全部的内容,包括:spring+ibatis在spring配置文件中注入sqlmapclient时,一直报错,详情代码见下面、Spring AOP(2)代理类的创建ProxyFactoryBean、Mybatis-Spring:SqlSessionFactoryBean等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9460241.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存