【Spring】- FactoryBean 介绍

FactoryBean:工厂Bean

IOC容器内部1种特殊的Bean,主要用于管理内部的Bean实例对象建立(单例/原型对象),扮演相似工厂的角色spring

##特色 经过Bean名称只能获取其生产的对象,而不是FactoryBean自己,若是须要获取FactoryBean自己能够经过“&Bean名称”的形式获取数据库

测试:mybatis

UserFactoryBeanapp

package com.zhiwei.factoryBean;
import org.springframework.beans.factory.FactoryBean;

public class UserFactoryBean implements FactoryBean<User> {

	/**
	 * FacotryBean生产的对象
	 */
	@Override
	public User getObject() throws Exception {
		return new User();
	}

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

	/**
	 * 判断FactoryBean管理的对象是不是单例对象
	 */
	@Override
	public boolean isSingleton() {
		return false;
	}
}

辅助类:User框架

package com.zhiwei.factoryBean;

public class User {

	private String name;
	private int age;
	
	public User(){
		this("zhangsan",20);
	}
	
	public User(String name,int age){
		this.name = name;
		this.age = age;
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "User [name=" + name + ", age=" + age + "]";
	}
}

Spring配置文件ide

<!-- 普通的FactoryBean -->
	<bean id="userFactoryBean" class="com.zhiwei.factoryBean.UserFactoryBean"/>

测试代码测试

ApplicationContext ac = new ClassPathXmlApplicationContext("com/zhiwei/factoryBean/applicationContext.xml");
		
		//---------获取FactoryBean生产的对象
		Object obj  = ac.getBean("userFactoryBean");
		System.err.println("userFactoryBean对象类型:"+obj.getClass().getName());
		
		//--------获取factoryBean自己
		obj = ac.getBean("&userFactoryBean");
		System.err.println("&userFactoryBean对象类型:"+obj.getClass().getName());
		
		//----------判断FactoryBean管理的是不是单例对象
		System.err.println("userFactoryBean管理单例对象:"+((UserFactoryBean)obj).isSingleton());

控制台日志:this

userFactoryBean对象类型:com.zhiwei.factoryBean.User
&userFactoryBean对象类型:com.zhiwei.factoryBean.UserFactoryBean
userFactoryBean管理单例对象:false

FactoryBean用途**

通常进行Spring和其余的ORM框架整合时通常会用到FactoryBean,例如整合Hibernate使用的LocalSessionFactoryBean,整合mybatis使用的SqlSessionFactoryBean等,通常这些FactoryBean主要用于对一些配置信息的管理,例如数据源日志

单例FactoryBean应用: 定义DatabaseFactoryBeancode

package com.zhiwei.factoryBean;
import org.springframework.beans.factory.FactoryBean;

/**
 * 单例模式:FactoryBean的应用
 * @author Yang ZhiWei
 *
 */
public class DatabaseFactoryBean implements FactoryBean<DatabaseConfig>{

	private  DatabaseConfig databaseConfig;
	
	public DatabaseConfig getDatabaseConfig() {
		return databaseConfig;
	}

	public void setDatabaseConfig(DatabaseConfig databaseConfig) {
		this.databaseConfig = databaseConfig;
	}

	/**
	 * 单例模式返回规定的对象
	 */
	@Override
	public DatabaseConfig getObject() throws Exception {
		
		if(null == databaseConfig){
			synchronized (databaseConfig) {
			   if(null == databaseConfig){
					databaseConfig = new DatabaseConfig();
				}
			}
		}
		return databaseConfig;
	}

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

	/**
	 * FactoryBean管理单例对象,返回true
	 */
	@Override
	public boolean isSingleton() {
		return true;
	}
}

辅助类:DatabaseConfig

package com.zhiwei.factoryBean;

/**
 * 数据库配置信息
 * @author Yang ZhiWei
 *
 */
public class DatabaseConfig {

	private String databaseName;
	private String ip;
	private String port;
	private String userName;
	private String passwd;

	public String getDatabaseName() {
		return databaseName;
	}

	public void setDatabaseName(String databaseName) {
		this.databaseName = databaseName;
	}

	public String getIp() {
		return ip;
	}

	public void setIp(String ip) {
		this.ip = ip;
	}

	public String getPort() {
		return port;
	}

	public void setPort(String port) {
		this.port = port;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPasswd() {
		return passwd;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	@Override
	public String toString() {
		return "DatabaseConfig [databaseName=" + databaseName + ", ip=" + ip + ", port=" + port + ", userName="
				+ userName + ", passwd=" + passwd + "]";
	}
}

Spring配置文件:

<!-- 配置数据源 -->
	<bean id="dataSource" class="com.zhiwei.factoryBean.DatabaseConfig">
	<property name="databaseName" value="test"/>
	<property name="ip" value="127.0.0.1"/>
	<property name="port" value="3306"/>
	<property name="userName" value="userName"/>
	<property name="passwd" value="test"></property>
	</bean>
	
	<!-- 配置数据库访问FactoryBean -->
	<bean id="databaseFactoryBean" class="com.zhiwei.factoryBean.DatabaseFactoryBean">
	<property name="databaseConfig" ref="dataSource"/>
	</bean>

测试代码:

//-----------------------使用数据库的FactoryBean
		DatabaseConfig databaseConfig = (DatabaseConfig) ac.getBean("databaseFactoryBean");
		System.out.println(databaseConfig);

控制台日志:

DatabaseConfig [databaseName=test, ip=127.0.0.1, port=3306, userName=userName, passwd=test]