从SqlSessionFactoryBean的引用浅谈spring两种bean模式

mybatis是以一个 SqlSessionFactory 的实例为中心的。SqlSessionFactory可以通过SqlSessionFactoryBuilder获得实例。使用mybatis-spring时,session创建,可以让SqlSessionFactoryBean来替代。

<bean name="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="*"/>
        <property name="configLocation" value="classpath:/*.xml"/>
    </bean>

普通自定义bean

<bean name="demoService" class="com.***.*"/>

虽然通过<bean>标签标识,但与自己定义的bean有很大区别。spring的bean分为二种普通bean和工厂bean,即FactoryBean。二者都有是由spring容器管理。SqlSessionFactoryBean就属于第二种bean,

SqlSessionFactoryBean是一个实现了spring的FactoryBean接口(implements FactoryBean<SqlSessionFactory>)的类。

接口FactoryBean只有三个方法
T getObject()
Class<?> getObjectType();
boolean isSingleton(); 设置是否为单例

区别是:工厂bean返回并不是指定类的实例,而是FactoryBean的方法getObejct()返回的实例。

这就说明了由 Spring 最终创建的 bean 不是 SqlSessionFactoryBean 本身 。 而是工厂类的 getObject()返回的方法的结果。正确的引用是 private SqlSessionFactory sqlSessionFactoryBean。

参考以下代码:

@Component("demoService")
public class DemoService implements FactoryBean<Demo>{
    @Override
    public Demo getObject() throws Exception {
        return new Demo();
    }

@Override
    public Class<?> getObjectType() {
        return Demo.class;
    }

@Override
    public boolean isSingleton() {
        return true;
    }
}

public static void main(String[] args) {
        ApplicationContext context=new AnnotationConfigApplicationContext("com.test");
        Object obj1 = context.getBean("demoService");
        Object obj2 = context.getBean("&demoService");
        System.out.println(obj1.getClass());//class com.test.Demo
        System.out.println(obj2.getClass());//class com.test.DemoService
    }

当使用ApplicationContext的getBean()方法获取FactoryBean实例本身而不是它所产生的bean,则要使用&符号+id。比如,现有FactoryBean,它有id,在容器上调用getBean("demoService")将返回FactoryBean所产生的bean,调用getBean("&demoService")将返回FactoryBean它本身的实例。

原文地址:https://www.cnblogs.com/song27/p/9373881.html

时间: 2024-07-31 01:52:31

从SqlSessionFactoryBean的引用浅谈spring两种bean模式的相关文章

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,openSession.getCurrentSession都是编程式事务(手动设置事务的提交.回滚)中重要的对象,HibernateDaoSupport则提供了更方便的声明式事务支持. Hibernate中最重要的就是Session对象的引入,它是对jdbc的深度封装,包括对事务的处理,Session对

浅谈Spring(四)AOP实例

在<浅谈Spring(三)AOP原理>中我详细的介绍了AOP的基本概念和实现原理,这里给出代码示例. 一.XML方式 1. TestAspect:切面类 package com.spring.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class TestAspect { public void doAfter(JoinPoint jp) { System

浅谈php设计模式(1)---工厂模式

一.接口继承直接调用 先看看这样一段代码: 1 <?php 2 3 interface db{ 4 function conn(); 5 } 6 7 class dbmysql implements db { 8 public function conn(){ 9 echo "连接到了mysql"; 10 } 11 } 12 13 class dbsqlite implements db{ 14 public function conn(){ 15 echo "连接到了

浅谈设计模式3-模板方法模式

模版方法模式,个人认为还是用处比较多的一个设计模式,而且也是比较好学和理解的一个.依然来通过模拟一个场景来慢慢了解. 现在我们来实现一下泡茶这个过程.首先我们需要烧开一壶水,然后往茶壶中放茶叶,加入开水,等待茶泡好. 经过前两次的分享,大家应该具备了基本的面向对象的思想了,这里就不再用面向过程的方式演示了. 首先,有一种普通人,他泡茶的方式是这样的 public class Common     { public void MakeTea()         {             Heat

浅谈JavaScript中的原型模式

在JavaScript中创建对象由很多种方式,如工厂模式.构造函数模式.原型模式等: <pre name="code" class="html">//工厂模式 function createPerson(name,age,job) { var o = new Object; o.name = name; o.age = age; o.job = job; o.sayName = function() { alert(this.name); } retur

浅谈数据标注平台运营模式

现如今,AI行业发展火热各大巨头都投入巨资在此领域布局,智能驾驶.人脸识别以及近段时间正火的AI养猪都是AI技术应用在实际生活上的体现,毫不夸张的说AI技术正在逐渐改变我们的生活而我们的生活也将因此变得更美好.AI的发展离不开数据标注的支持,在此不再详谈数据标注和人工智能的关系,感兴趣的可以可以查看<人工智能之数据标注> 一.常见的数据标注平台 由于数据标注的重要性和高质量标注好数据的稀缺性在催生了一大批专职做数据标注团队的同时也催生了一批数据标注平台,比较有名的有百度众测.京东众智.龙猫数据

javaweb学习总结(二十一)——JavaWeb的两种开发模式

SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1.1.jsp+javabean开发模式架构 jsp+javabean开发模式的架构图如下图(图1-1)所示 图1-1 在jsp+javabean架构中,JSP负责控制逻辑.表现逻辑.业务对象(javabean)的调用. JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下

php微信开发 -- 两种运营模式及服务器配置

微信的两种运营模式 编辑模式:使用微信公众平台提供的功能 开发者模式:通过腾讯的api接口调用相应程序进行二次开发 编辑模式 应用场景: l 不具备开发能力的运营者 l 主要是进行品牌宣传.新闻媒体.自助客服的公众帐号 l 运营初期,不需要特别多的功能 l 开发模式系统升级.故障等特殊情况 功能演示: 1)自动回复 被添加自动回复:当我们订阅或关注微信公众平台时,系统自动发送的回复,我们称之为关注回复或订阅回复. 关键词自动回复:当用户输入的关键词与我们系统设置的关键词相匹配时,自动返回的回复.

AGPS 常见的两种定位模式

SI 定位模式: 用户发起定位请求,辅助GPS 模块快速进行定位.时间在6秒-15秒之间. 这个方式能够有效的解决普通GPS 最快需要30秒时间获得卫星星历的搜星慢的问题,如果使用AGPS将通过中移动的服务器拿到卫星星历,时间可以缩短到6秒-15秒. 对应流程: 启动AGPS UI 管理 -> 开始获取基站信息.IMSI信息―> 启动拨号->与中移动服务器进行SUPL 协议通讯获取卫星星历――> 配置GPS模块进行定位->关闭通讯网络-> 导航软件快速获取精度.纬度.