从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它本身的实例。
从SqlSessionFactoryBean的引用浅谈spring两种bean模式的更多相关文章
- 浅谈Java两种并发类型——计算密集型与IO密集型
转载:https://blog.csdn.net/u013070853/article/details/49304099 核心是可以分别独立运行程序指令的计算单元.线程是操作系统能够进行运算调度的最小 ...
- 浅谈Spring的两种配置容器
浅谈Spring的两种配置容器 原文:https://www.jb51.net/article/126295.htm 更新时间:2017年10月20日 08:44:41 作者:黄小鱼ZZZ ...
- 浅谈Spring中的Quartz配置
浅谈Spring中的Quartz配置 2009-06-26 14:04 樊凯 博客园 字号:T | T Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在 ...
- 浅谈UML——九种图(一)
前言 学UML将近两个星期了,对UML有了一定的了解,学过的没学过的都知道UML中最最最核心的部分要数那九个图了.浅谈UML九种图. 实例 1.用例图: 什么是用例?描绘一个系统外在可见的需求情况,是 ...
- ASP.Net的两种开发模式
一.ASP.Net的两种开发模式 1.1 ASP.Net WebForm的开发模式 (1)处理流程 在传统的WebForm模式下,我们请求一个例如http://www.aspnetmvc.com/bl ...
- 咸鱼入门到放弃10--javaweb的两种开发模式
(本篇是之前方法的综合使用,新东西不多,其中也涉及三层架构的问题.此处直接引用了大佬blog:https://www.cnblogs.com/xdp-gacl/p/3908610.html) SUN公 ...
- java web学习总结(二十九) -------------------JavaBean的两种开发模式
SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. 一.JSP+JavaBean开发模式 1 ...
- 一步一步学FRDM-KE02Z(一):IAR调试平台搭建以及OpenSDA两种工作模式设置
摘要:FRDM-KE02Z是飞思卡尔公司较为新的微控制器,学习和开发资料较少.从本篇开始会陆续介绍其相关的开发流程,并完成一个小型的工程项目.这是本系列博客的第一篇,主要介绍开发环境IAR for A ...
- Spark on YARN两种运行模式介绍
本文出自:Spark on YARN两种运行模式介绍http://www.aboutyun.com/thread-12294-1-1.html(出处: about云开发) 问题导读 1.Spark ...
随机推荐
- 以后的IT路还很长(1)
以后的IT路还很长(1) 最近有两位兄弟同事离职了,蛮可惜了,在一个战壕一起一.两年了,人各有志嘛!希望他们发展更好些! 目前的公司是个创业型的公司,公司从08年的50来个人,扩张到今年11年400多 ...
- PHP正则表达式-修饰符
我们在PHP正则表达式的学习中会碰到修饰符,那么关于PHP正则表达式修饰符的理解以及使用我们需要注意什么呢?那么我们来具体的看看它的概念以及相关内容.在学习PHP正则表达式修饰符之前先来理解下贪婪模式 ...
- SAT考试里最难的数学题? · 三只猫的温暖
问题 今天无意中在Quora上看到有人贴出来一道号称是SAT里最难的一道数学题,一下子勾起了我的兴趣.于是拿起笔来写写画画,花了差不多十五分钟搞定.觉得有点意思,决定把解题过程记下来.原帖的图太小,我 ...
- shell编程1:变量的使用与例子
一.Shell脚本的执行通常可以采用以下几种方式: 1):bash script-name或sh script-name(推荐使用) 2):path/script-name 或./script-nam ...
- 想要成为一名优秀的Java程序员,你需要这8个锦囊
私底下,隔三差五就有读者问我:"二哥,怎么样才能像你一样,成为一名优秀的 Java 开发者呢?"假如把"怎么才能像你一样"去掉的话,这个问题就是一个好问题,否则 ...
- kafka知识整理
title: kafka知识整理 date: 2019-06-18 10:59:46 categories: MQ tags: kafka --- 转载自:https://www.cnblogs.co ...
- Dubbo 入门-细说分布式与集群
什么是Dubbo Dubbo是一款高性能.轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现. 什么是RPC RPC全称(Rem ...
- Python3爬虫使用requests爬取lol英雄皮肤
本人博客:https://xiaoxiablogs.top 此次爬取lol英雄皮肤一共有两个版本,分别是多线程版本和非多线程版本. 多线程版本 # !/usr/bin/env python # -*- ...
- aosp 制作 rom 刷机 添加厂家二进制驱动 及 出厂镜像
首先介绍下背景知识. aosp 仅是一套源码,不含厂家驱动. CM安卓的厂家驱动是自行提取的. 一般的安卓手机分区,有 boot , system, user , Baseband 基带, recov ...
- django 从零开始 4 404页面和500页面设置
在视图函数中定义两个 函数 分别对应404 个500页面 (自定义html内容吧,这里只是展示) 在template页面指向自己定义的404.html和500.html页面 在项目的urls中设置 h ...