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]