Spring的FactoryBean的基本认识

来源:互联网 发布:魔兽数据库7.0手机 编辑:程序博客网 时间:2024/06/10 00:12

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<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配置文件

<!-- 普通的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());

控制台日志:

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

FactoryBean的用途

一般进行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<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]

1 0
原创粉丝点击