FactoryMethod与FactoryBean

在Spring中当需要实例化第三方类库中的类时,可以使用FactoryMethod或者FactoryBean实现解耦。例如Car是第三方类库中的一个类,当我们需要使用Car对象时,可以有如下几种方式。

Instance Factory Method

  • 静态方法

    public class StaticFactory {
        public static Car getInstance() {
            return new Car();
        }
    }
    
  • XML配置

    <!--静态工厂方法模式配置-->
    <bean id="car" class="com.sac.factory.StaticFactory" factory-method="getInstance">  </bean>
    

Instance Factory Method

  • 实例方法

    public class NoneStaticFactory {
        public  Car getInstance() {
            return new Car();
        }
    }
    
  • XML配置

    <!--实例工厂方法模式配置-->
    <bean id="noneStaticFactory" class="com.sac.factory.NoneStaticFactory"></bean>
    <bean id="car" factory-bean="noneStaticFactory" factory-method="getInstance"></bean>
    

FactoryBean

  • CarFactoryBean

    public class CarFactoryBean implements FactoryBean<Car> {
        @Override
        public Car getObject() {
            return new Car();
        }
    
        @Override
        public Class<Car> getObjectType() {
            return Car.class;
        }
    
        @Override
        public boolean isSingleton() {
            return false;
        }
    }
    
  • XML 配置

      <bean id="car" class="com.sac.factorybean.CarFactoryBean"></bean>
    
  • 加&与不加&

    在使用FactoryBean时,如果想获取FactoryBean的实例则需要在bean名称前添加&,否则获取的是getObject方法中返回的实例。
    例如,获取Bean带着&

      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
      System.out.println(ctx.getBean("&car"));
    

    输出结果

    com.sac.factorybean.CarFactoryBean@7d70d1b1
    

    不带着&

     ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
     System.out.println(ctx.getBean("car"));
    

    输出结果

    com.sac.bean.Car@7d70d1b1
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。