- 摘要:FactoryBean:工厂BeanIOC容器内部一种特殊的Bean,主要作用就是管理内部的Bean实例对象(单例/原型对象),扮演类似工厂的角色特点:通过Bean名称只能获取其生产的对象,而不是FactoryBean本身,如果需要获取FactoryBean本身可以通过“&;Bean名称”的形式获取测试:首先构建一个FactoryBean:UserFactoryBeanpackagecom.zhiwei.factoryBean;importorg.springfram
-
FactoryBean:工厂Bean
IOC容器内部一种特殊的Bean,主要作用就是管理内部的Bean实例对象(单例/原型对象),扮演类似工厂的角色
特点:
通过Bean名称只能获取其生产的对象,而不是FactoryBean本身,如果需要获取FactoryBean本身可以通过“&;Bean名称”的形式获取
测试:
首先构建一个FactoryBean:UserFactoryBean
package com.zhiwei.factoryBean;
import org.springframework.beans.factory.FactoryBean;
public class UserFactoryBean implements FactoryBean {
/**
* FacotryBean生产的对象
*/
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class 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配置文件:
测试代码:
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());控制台日志:
userFactoryBean对象类型:com.zhiwei.factoryBean.User
&;userFactoryBean对象类型:com.zhiwei.factoryBean.UserFactoryBean
userFactoryBean管理单例对象:falseFactoryBean的用途:
一般进行Spring和其他的ORM框架整合时一般会用到FactoryBean,例如整合Hibernate使用的LocalSessionFactoryBean,整合mybatis使用的SqlSessionFactoryBean等,一般这些FactoryBean主要用于对一些配置信息的管理,例如数据源
单例FactoryBean应用:
定义DatabaseFactoryBean:
package com.zhiwei.factoryBean;
import org.springframework.beans.factory.FactoryBean;
/**
* 单例模式:FactoryBean的应用
* @author Yang ZhiWei
*
*/
public class DatabaseFactoryBean implements FactoryBean {
privateDatabaseConfig 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) {
databaseConfig = new DatabaseConfig();
}
}
return databaseConfig;
}
@Override
public Class 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配置文件:
测试代码:
//-----------------------使用数据库的FactoryBean
DatabaseConfig databaseConfig = (DatabaseConfig) ac.getBean("databaseFactoryBean");
System.out.println(databaseConfig);控制台日志:
Spring的FactoryBean的基本认识
最新推荐文章于 2023-05-17 09:12:52 发布