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
通常进行Spring和其余的ORM框架整合时通常会用到FactoryBean,例如整合Hibernate使用的LocalSessionFactoryBean,整合mybatis使用的SqlSessionFactoryBean等,通常这些FactoryBean主要用于对一些配置信息的管理,例如数据源日志
单例FactoryBean应用: 定义DatabaseFactoryBean:code
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]