Spring FactoryBean机制介绍

前沿:

在说spring之前,先提一下spring的基本原理,依赖注入,控制反转。我们在配置spring的时候有两种bean可以配置,

一种是普通bean:配置的class就是生成的bean的真正对象。

一种是工厂Bean,即FactoryBean:配置class不是生成bean的真正对象。

他们都被spring容器管理,工厂Bean其返回的对象不是指定类的一个实例,是该FactoryBean的getObject方法所返回的对象。

普通人可能只知道一种,在Spring内部,有很多地方用到FactoryBean实现功能,

应用:它们在很多应用如(Spring的AOP、ORM、事务管理)及与其它第三框架(ehCache)集成时都有体现,

实现:

1. FactoryBean接口

 1 package org.springframework.beans.factory;
 2
 3 public interface FactoryBean<T> {
 4
 5     T getObject() throws Exception;
 6
 7     Class<?> getObjectType();
 8
 9     boolean isSingleton();
10
11 }    

其中是java泛型机制实现,即T表示要生成的对象。也可以不使用,推荐使用。
getObject()方法返回欲生成对象。getObjectType()欲返回对象类型,isSingleton()获得对象的机制(singleton|prototype|request|session).

2. 例子:mybatis和spring集成实例

 1 package com.debug.factory;
 2
 3 import java.io.InputStream;
 4
 5 import org.apache.ibatis.io.Resources;
 6 import org.apache.ibatis.session.SqlSessionFactory;
 7 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
 8 import org.springframework.beans.factory.FactoryBean;
 9
10 public class SqlSessionFactoryBean implements FactoryBean<SqlSessionFactory> {
11     SqlSessionFactory sessionFactory;
12
13     @Override
14     public SqlSessionFactory getObject() throws Exception {
15         System.out.println("getObject");
16         String resource = "mybatis-config1.xml";
17         InputStream in = Resources.getResourceAsStream(resource);
18         sessionFactory = new SqlSessionFactoryBuilder().build(in);
19         return sessionFactory;
20     }
21
22     @Override
23     public Class<?> getObjectType() {
24         // TODO Auto-generated method stub
25         System.out.println("getObjectType");
26         return SqlSessionFactory.class;
27     }
28
29     @Override
30     public boolean isSingleton() {
31         System.out.println("isSingleton");
32         return true;
33     }
34 }

application.xml配置

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:aop="http://www.springframework.org/schema/aop"
 5     xmlns:context="http://www.springframework.org/schema/context"
 6     xmlns:tx="http://www.springframework.org/schema/tx"
 7     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
 9         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
10         http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">
11
12     <bean id="mysqlsessionfactory" class="com.debug.factory.SqlSessionFactoryBean" scope="prototype">
13
14     </bean>
15 </beans>

调用测试代码

1 ApplicationContext app = new ClassPathXmlApplicationContext("application.xml");
2 {
3     SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) app.getBean("mysqlsessionfactory");
4     System.out.println(sqlSessionFactory);
5 }
6 {
7     SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) app.getBean("mysqlsessionfactory");
8     System.out.println(sqlSessionFactory);
9 }

生成:

1 isSingleton
2 getObjectType
3 isSingleton
4 getObject
5 [email protected]f04
6 [email protected]f04

说明,容器通过getBean方法返回的不是SqlSessionFactory本身,而是FactoryBean实现类中getObject()方法返回的对象。

上面代码是自己集成的mybatis如果用官方的包可以使用spring mybatis项目提供的代码mybatis-spring-1.2.0.tar.gz中的org.mybatis.spring.SqlSessionFactoryBean。

spring配置如下:

1 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
2     <property name="dataSource" ref="dataSource" />
3     <property name="configLocation" value="classpath:mybatis-config.xml" />
4 </bean>

3. FactoryBean的扩展应用之Spring集成 ehcache

 1 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
 2     <property name="configLocation">
 3         <value>classpath:ehcache.xml</value>
 4     </property>
 5 </bean>
 6 <bean id="levelOneCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
 7     <property name="cacheManager">
 8         <ref local="cacheManager" />
 9     </property>
10     <property name="cacheName">
11         <value>levelOneCache</value>
12     </property>
13 </bean> 

调用代码

 1 public class MainTest {
 2     public static void main(String[] args) {
 3         Resource res = new ClassPathResource("bean.xml");
 4         BeanFactory factory = new XmlBeanFactory(res);
 5         //取到CacheManager类的实例
 6         CacheManager cacheManager = (CacheManager) factory .getBean("cacheManager");
 7         //取到Cache类的实例
 8         Cache levelOneCache = cacheManager.getCache("levelOneCache");
 9     }
10 }  

更过详细设置参考其他详细资料!

时间: 2024-10-25 03:51:13

Spring FactoryBean机制介绍的相关文章

[转]注释驱动的 Spring cache 缓存介绍

原文:http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/ 概述 Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如 EHCache 或者 OSCache),而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的各种 annotation,即能够达到缓存方法的返回对象的效果. Spring 的缓存技术还具备相当的灵活性,不仅能

NSNotificationCenter消息通信机制介绍(KVO)

NSNotificationCenter消息通信机制介绍(KVO) 作用:NSNotificationCenter是专门供程序中不同类间的消息通信而设置的. 注册通知:即要在什么地方接受消息                [[NSNotificationCenter defaultCenter]  addObserver:self selector:@selector(mytest:) name:@" mytest" object:nil];        参数介绍:         

IOS 阶段学习第25天笔记(IOS沙盒机制介绍)

IOS学习(OC语言)知识点整理 一.IOS沙盒机制介绍 1)概念:每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒,但在ios8中已经开放访问(extension) 2)extension是ios8新开放的一种对几个固定系统区域的拓展机制,它可以在一定程度上弥补ios的沙盒机制对应用间的通信限制 3)应用沙盒一般包括以下几个文件目录: 1.应用程序包:包含所有资源文件和可执行文件 2.Documents:保存应用

Spring Boot的介绍

<Spring Boot基础教程> 第1节 Spring Boot的介绍   一.课程简介 1)Spring Boot简介 使用Java做Web应用开发已经有近20年的历史了,从最初的Servlet1.0一步步演化到现在如此多的框架,库以及整个生态系统.经过这么 长时间的发展,Java作为一个成熟的语言,也演化出了非常成熟的生态系统,这也是许多公司采用Java作为主流的语言进行服务器端开发的原因,也是为什么Java一直保持着非常活跃的用户群.Android 最受Java开发者喜好的框架当属Sp

Spring 事务机制详解

Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,仅供学习参考. Spring声明式事务让我们从复杂的事务处理中得到解脱.使得我们再也无需要去处理获得连接.关闭连接.事务提交和回滚等这些操作.再也无需要我们在与事务相关的方法中处理大量的try…catch…finally代码.我们在使用Spring声明式事务时,有一个非常重要的概念就是事务属性.事务属性通常由事务的传播行为,事务的隔离级别,事务的超时值和事务只读标志组成.我们在进行事

转:Spring FactoryBean源码浅析

http://blog.csdn.net/java2000_wl/article/details/7410714 在Spring BeanFactory容器中管理两种bean 1.标准Java Bean 2,另一种是工厂Bean,   即实现了FactoryBean接口的bean  它不是一个简单的Bean 而是一个生产或修饰对象生成的工厂Bean 在向Spring容器获得bean时  对于标准的java Bean  返回的是类自身的实例 而FactoryBean 其返回的对象不一定是自身类的一

Spring FactoryBean源码浅析

在Spring BeanFactory容器中管理两种bean 1.标准Java Bean 2,另一种是工厂Bean,   即实现了FactoryBean接口的bean  它不是一个简单的Bean 而是一个生产或修饰对象生成的工厂Bean 在向Spring容器获得bean时  对于标准的java Bean  返回的是类自身的实例 而FactoryBean 其返回的对象不一定是自身类的一个实例,返回的是该工厂Bean的getObject方法所返回的对象 一个简单的例子 [java] view pla

攻城狮在路上(贰) Spring(二)--- Spring IoC概念介绍

一.IoC的概念: IoC(控制反转)是Spring容器的核心.另一种解释是DI(依赖注入),即让调用类对某一个接口的依赖关系由第三方注入,以移除调用类对某一个接口实现类的一览. 定义如此,由此可见,在面向接口编程的情况下,IoC可以很好的实现解耦,可以以配置的方式为程序提供所需要的接口实现类. 在实际程序开发中,我们只需要提供对应的接口及实现类,然后通过Spring的配置文件或者注解完成对依赖类的装配.二.IoC的类型: 1.通过构造函数: 此种方式的缺点是,在构造函数中注入之后一般会作为一个

spring FactoryBean配置Bean

概要: 实例代码详解: 目录结构 Car.java package com.coslay.beans.factorybean; public class Car { private String brand; private double price; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public double getPric