美文网首页
BeanFactory & FactoryBean

BeanFactory & FactoryBean

作者: 一岁一枯荣啊 | 来源:发表于2019-11-01 14:36 被阅读0次

1.BeanFactory & FactoryBean区别

spring中的bean分两种,一种是普通的bean一种是FactoryBean,FactoryBean使用bean结尾说明他也是一个bean,不同的FactoryBean是一个工厂类接口,我们可以使用FactoryBean<T>自定义实例化Bean。获取factorybean返回的就是FactoryBean的getObject方法返回的对象,是不是单例的也是由FactoryBean
.isSingleton方法决定。

获取FactoryBean对象本身,需要在id前面加一个&符号来获取

如果一些bean的构造方式比较复杂,我们可以使用FactoryBean自定义它的实例化逻辑

2.FactoryBean使用示例

业务说明:使用FactoryBean自定义ioc当中User这个对象的示例化过程


/**
 * 实体类
 */
public class User {
    private String id;
    private String name;

    public User(String id, String name) {
        this.id = id;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

/**
 * 定义user这个bean生成的自定义逻辑,UserFactoryBean
 */
public class UserFactoryBean implements FactoryBean<User> {
    @Override
    public User getObject() throws Exception {
        return new User("1", "admin");
    }

    @Override
    public Class<?> getObjectType() {
        return User.class;
    }

//是否是单例的
    @Override
    public boolean isSingleton() {
        return true;
    }
}


/**
 * 创建一个获取springApplicationContext的工具
 */
@Component
public class SpringContextAware implements ApplicationContextAware {
    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String name) {
        return getApplicationContext().getBean(name);
    }

    public static <T> T getBean(Class<T> clazz) {
        return getApplicationContext().getBean(clazz);
    }

    public static <T> T getBean(String name, Class<T> clazz) {
        return getApplicationContext().getBean(name, clazz);
    }
}
/**
 * 配置这个用户bean
 */
 @Bean(name = "user")
 public UserFactoryBean getUserFactoryBean() {
    return new UserFactoryBean();
 }


测试代码

//获取bean name 为user 的类
Object obj1 = SpringContextAware.getBean("user");
System.out.println(obj1);
//获取factory bean 本身加&
Object obj2 = SpringContextAware.getBean("&user");
System.out.println(obj2);

控制台结果
com.example.depy.democontrol.entity.User@1113517a
com.example.depy.democontrol.config.UserFactoryBean@4e0f5d0d

相关文章

网友评论

      本文标题:BeanFactory & FactoryBean

      本文链接:https://www.haomeiwen.com/subject/ucifbctx.html