Spring的FactoryBean的基本认识

  • 摘要: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管理单例对象: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 { 
    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)