使用FactoryBean接口实现自定义bean初始化

使用FactoryBean接口实现自定义bean初始化

 

       本文所要介绍的FactoryBeanSpring中定义的一个接口,当把它的实现类定义为BeanFactory中的一个bean,我们在获取其对应的bean时实际上获取的是FactoryBean所包含的那个对象,而不是它本身。我们先来看一下FactoryBean的定义。

public interface FactoryBean<T> {
 
   /**
    * 获取实际要返回的bean对象。
    * @return
    * @throws Exception
    */
   T getObject() throws Exception;
 
   /**
    * 获取返回的对象类型
    * @return
    */
   Class<?> getObjectType();
 
   /**
    * 是否单例
    * @return
    */
   boolean isSingleton();
 
}

 

 

       我们可以看到FactoryBean是使用了泛型的,表示其对应产生的Bean是什么类型的对象。我们来看一个实现。

public class UserFactoryBean implements FactoryBean<User> {
 
   private User user;
 
   @Override
   public User getObject() throws Exception {
      if (user == null) {
         synchronized (this) {
            if (user == null) {
                User user = new User();
                user.setId(1);
                user.setName("张三");
                this.user = user;
            }
         }
      }
      returnuser;
   }
 
   @Override
   public Class<?> getObjectType() {
      return User.class;
   }
 
   @Override
   public boolean isSingleton() {
      return true;
   }
  
}

 

 

       上面代码中定义了一个UserFactoryBean,用以产生一个单例的User对象。可以看到,我们在getObject()方法中使用了同步块来保证产生的bean永远是同一个对象。其实这个并不是必须的。在初始化时BeanFactory调用FactoryBean创建bean时就是同步的,而且BeanFactory创建bean时默认是单例的,也就意味着FactoryBeangetObject方法在BeanFactory中定义为单例的时候只会调用一次。但有一种情况例外,那就是如果定义bean时指定了“lazy-init=true”时,那就意味着该bean只有在用到的时候才会进行初始化,这个时候如果刚好两个线程同时需要使用,就会出现在两个线程中同时调用FactoryBeangetObject方法进行bean的初始化,如不加控制就会出现两个实例。为保证只有一个实例,getObject方法内部需要是同步的。

       此外,需要注意的是FactoryBean的isSingleton方法返回结果表示当前FactoryBean产生的bean是否是单例形式,即每次请求getObject()方法返回的是否都是同一个bean对象。其实FactoryBean更多的是在Spring内部使用,isSingleton只是用来表示当前返回的bean对象是否可以用BeanFactory缓存的一个标志。

       上面示例对象的Spring配置文件如下:

       <bean id="userFactoryBean" class="com.xxx.spring.factorybean.UserFactoryBean" lazy-init="false"/>

 

       对于一个FactoryBean接口实现类定义的bean其实Spring将实例化两个bean,一个是FactoryBean本身对应的bean,另一个是FactoryBean产生的对象对应的bean。所以当我们在通过注解方式注入一个FactoryBean实例对应的bean时,既可以把它当做一个FactoryBean进行注入,也可以把它当做一个对应产生的实例进行注入。而如果是自己直接从ApplicationContext中获取的话,则直接通过FactoryBean实现类定义的bean名称获取到的是FactoryBean实现类产生的对象。如在上面示例中,如果我们通过ApplicationContextgetBean(“userFactoryBean”)获取到的就将是对应产生的User对象,如果我们需要获取到对应的FactoryBean本身,则可以在对应的FactoryBean实现类定义的bean名称前加上“&”进行获取,如上如果我们要获取到UserFactoryBean本身,则可以通过ApplicationContextgetBean(“&userFactoryBean”)。如果是通过类型获取,就可以直接通过User类型或者UserFactoryBean类型获取到对应的bean对象了。

 

(注:本文是基于Spring3.1.0所写)

 

 

 

 

 

 

 

 

 

### 回答1: FactoryBean是Spring框架中的一个接口,用于创建和管理对象。它的实现类有很多,常见的有以下几种: 1. BeanFactory:Spring框架中的基础工厂类,用于管理Bean对象的创建、初始化、配置和生命周期等。 2. ListableBeanFactory:扩展了BeanFactory接口,提供了一些列出所有Bean对象的方法。 3. ConfigurableBeanFactory:继承了ListableBeanFactory接口,增加了对Bean对象配置的支持。 4. DefaultListableBeanFactoryBeanFactory的默认实现类,实现Bean对象的创建、初始化、配置和生命周期等。 5. XmlBeanFactory:从XML配置文件中读取Bean对象的定义和配置信息,并根据定义创建Bean对象。 6. AnnotationConfigApplicationContext:基于注解的配置方式创建应用上下文,支持自动扫描和装配Bean对象。 还有其他的实现类,不一一列举。 ### 回答2: FactoryBean是Spring框架中的一个接口,用于创建对象并将其添加到Spring容器中。 FactoryBean接口实现类有多种,常见的包括: 1. BeanFactory:是FactoryBean接口的默认实现类,用于创建和管理Bean对象。它可以是一个简单的Bean工厂,也可以是一个复杂的Bean容器。 2. ListFactoryBean:用于创建List类型的对象,可以通过配置项添加多个元素到List中。 3. MapFactoryBean:用于创建Map类型的对象,可以通过配置项添加多个键值对到Map中。 4. PropertiesFactoryBean:用于创建Properties类型的对象,可以通过配置项添加多个键值对到Properties中。 5. ProxyFactoryBean:用于创建代理对象,其可以代理一个或多个目标对象,并提供额外的功能,如事务管理、AOP等。 6. MessageSourceFactoryBean:用于创建国际化消息资源对象,用于实现对多种语言的消息资源的管理。 除了上述的常见实现类外,还可以根据具体需求自定义FactoryBean的实现类,通过实现FactoryBean接口,并根据需求覆写相关方法来创建特定类型的对象并添加到Spring容器中。 FactoryBean的作用是将对象的创建过程封装起来,隐藏创建过程的细节,使得创建对象的流程可以配置化和可扩展。同时,FactoryBean也提供了对对象的管理功能,可以对对象的生命周期进行统一管理。 ### 回答3: FactoryBean是Spring框架中的一个接口,用于创建和管理对象的工厂类。它的实现类有以下几种: 1. ObjectFactoryBean:通过实现FactoryBean接口的getObject方法返回指定的对象实例。 2. ListFactoryBean:通过实现FactoryBean接口的getObject方法返回一个List集合的实例。 3. SetFactoryBean:通过实现FactoryBean接口的getObject方法返回一个Set集合的实例。 4. MapFactoryBean:通过实现FactoryBean接口的getObject方法返回一个Map集合的实例。 5. PropertiesFactoryBean:通过实现FactoryBean接口的getObject方法返回一个Properties对象的实例。 6. XMLBeanFactory:通过解析XML配置文件,并实现FactoryBean接口的getObject方法返回指定Bean实例。 除了以上常见的实现类,我们也可以自定义实现FactoryBean接口的类来创建和管理其他类型的对象。 FactoryBean的实现类在Spring的配置文件中通常以<bean>标签的方式进行配置,其中class属性指定FactoryBean的实现类名,而FactoryBean创建的对象通过getObject方法返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值