美文网首页SSM随笔-生活工作点滴Spring
Spring-FactoryBean学习(更灵活的创建bean的

Spring-FactoryBean学习(更灵活的创建bean的

作者: 小胖学编程 | 来源:发表于2019-07-25 18:17 被阅读207次

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

1. 为什么使用FactoryBean

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

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

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

2. FactoryBean是什么

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

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

3. FactoryBean怎么用

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

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

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

    private String params = "";

    private List<String> list;

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

    public List<String> 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<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }
}
    <bean id="myList" class="com.springmvc.common.aspect.MyFactoryBean">
        <property name="params" value="1,2,3,4"/>
    </bean>

总结

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

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

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

文章参考

FactoryBean的作用

相关文章

网友评论

    本文标题:Spring-FactoryBean学习(更灵活的创建bean的

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