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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)