Spring进阶篇(3)-FactoryBean(创建复杂的Bean)

JAVA && Spring && SpringBoot2.x — 学习目录

在Spring中有两种类型的bean,一种是普通Bean,一种是工厂Bean,即FactoryBean。FactoryBean跟普通bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。创建出的对象是否属于单例由isSingleton中的返回决定。

1. 为什么使用FactoryBean

一般情况下,Spring通过反射机制,利用中的class属性指定的实现类实例化Bean。在某些情况下,实例化Bean过程比较复杂,如果按照传统的方式,需要在中提供大量的配置信息。配置方法的灵活性受限,这时采用编码方式可能会得到一个简单的方案。Spring为此提供了一个org.springframework.bean.factory.FactoryBean工厂类接口,用户可以通过实现该接口定制实例化Bean的逻辑。可以隐藏实例化一些复杂Bean的细节。给上层应用带来便利。

从Spring3.0开始,FactoryBean开始支持泛型,即接口声明改为FactoryBean的形式。

以Bean结尾,表示他是一个Bean,不同于其他bean的是:它实现了FactoryBean的接口。该Bean的ID实际上是从BeanFactory中获取的实际的getObject()返回的对象,而不是FactoryBean本身。如果要获取FactoryBean对象,可以在id前面加一个&符号来获取。

2. FactoryBean是什么

package org.springframework.beans.factory;
 
public interface FactoryBean {
    //返回由FactoryBean创建bean的实例,如果是单例模式(isSingleton=true)
    //则该实例会放在Spring容器单例的缓存池中。
    T getObject() throws Exception;
    //返回FactoryBean创建的Bean实例
    Class getObjectType();
   //返回由FactoryBean创建的实例是单例还是多例的
    boolean isSingleton();
  }

当配置文件中的class属性配置的实现类是FactoryBean时,通过getBean()方法返回的实际上是getObject的对象。

3. FactoryBean怎么用

FactoryBean通常是用来创建比较复杂的Bean,一般的bean使用XML配置即可,但若是一个Bean的创建过程中涉及到很多其他Bean 和 复杂的逻辑,使用XML配置比较复杂的话,这时可以考虑使用FactoryBean。

@Component
public class MyFactoryBean implements FactoryBean>, InitializingBean, DisposableBean {

    private static final Logger logger = LoggerFactory.getLogger(MyFactoryBean.class);

    private String params = "";

    private List list;

    //InitializingBean实现方法
    public void afterPropertiesSet() throws Exception {
        //属性注入完后,调用该方法,该方法可以实现“业务”逻辑。创建出List集合
        String[] split = params.split(",");
        list = Arrays.asList(split);
    }

    public List getObject() throws Exception {
        return list;
    }

    public Class getObjectType() {
        return List.class;
    }

    public boolean isSingleton() {
        return true;
    }

    //[dɪˈspəʊzəbl](对象销毁的时候会调用 蒂斯跑则报)DisposableBean  接口的实现方法
    public void destroy() throws Exception {
        logger.debug("对象销毁...");
    }

    public String getParams() {
        return params;
    }

    public void setParams(String params) {
        this.params = params;
    }

    public List getList() {
        return list;
    }

    public void setList(List list) {
        this.list = list;
    }
}
    
        
    

总结

将对象交由Spring管理的方式:

  1. 使用XML配置文件标签;
  2. 在自定义类上使用@Component注解(将自定义对象交由Spring管理)
  3. 使用FactoryBean灵活的创建出对象,然后使用XML或者@Component注解交由Spring管理。
  4. 使用@Bean注解(灵活的创建对象,并放入Spring容器中);

注:本质上Spring的IOC(控制反转),包含两步,一是创建出bean,二是将其放入到容器中。
1. xml配置文件的方式,是Spring通过反射机制创建对象,再放入到容器中。对于我们来说,我们发挥的空间不大,必须按照特定的规则注入属性。面对繁杂的对象,或者可灵活(依赖数据库,实时查询)配置的对象,便有些无力了。而FactoryBean可以解决复杂对象创建。通过代码的方式,创建出bean对象(实际上是通过new的方式),然后在通过@Component或者XML配置放入到容器中。
2. @Bean注解,不仅可以在代码中我们手动的创建出bean对象(new),而且可以注入到容器中,可以说是一种更加方便的解决方案!

文章参考

FactoryBean的作用

你可能感兴趣的:(Spring进阶篇(3)-FactoryBean(创建复杂的Bean))