spring中有两种类型的bean, 第一种是普通bean, 另一种是工厂bean, 即FactoryBean . 工厂bean和普通bean不同, 其返回的对象不是指定类的实例, 其返回的是该工厂bean的getObject方法返回的对象 . spring内部AOP相关功能, 以及spring和mybatis整合也都使用到FactoryBean .
分析spring和mybatis整合后FactoryBean的使用 .
我们在使用mybatis时候, 会见到这样的配置 :
这样我们就可以在service层代码中注入”userMapper”, 既可以利用”userMapper”进行数据库操作 .
我们这里不探讨如何查询数据库之类问题 , 我们来学习这里如何巧妙使用MapperFactoryBean .
我们进入class中 :
我们发现这个类实现了”FactoryBean”, 这样在spring底层生成对象的时候是会直接返回getObject()方法返回的对象 .
我们来看getObject()方法 :
实际上调用SqlSessionTemplate的getMapper方法 :
一步步跟下来…
最后会走到”MapperProxyFactory” :
最终会根据我们提供的接口和SqlSession生成一个代理类,
所以最后MapperFactoryBean的getObject()方法返回的是接口和SqlSession生成的代理类, 感兴趣的可以查看源码 .
所以我们会发现, 其实我们在使用mybatis时候, 只提供了相应的接口和Mapper配置文件, 就可以调用接口进行查询数据库, 其实是底层帮助我们生成了一个个的代理类, 这些代理类实现了我们提供接口类型 . 那么我们在service层使用接口最终调用是代理类 .
那么这些代理类生成都是利用FactoryBean, 底层为我们生成代理类, 并通过getObject()返回 .