首页 文章

Spring中的FactoryModuleBuilder,@ AssistedInject和@Assisted相当于什么?

提问于
浏览
10

Spring FrameworkGoogle Guice中的FactoryModuleBuilder@AssistedInject@Assisted等效是什么?换句话说,使用Spring创建工厂对象的建议方法是什么,其方法接受应用程序(而不是容器)必须提供的参数?

Spring静态工厂方法与 FactoryModuleBuilder 不同 . FactoryModuleBuilder 构建一个Guice模块,生成"factories",实现Factory Method Pattern . 与Spring静态工厂方法不同,这些工厂对象的方法是实例方法,而不是静态方法 . 静态工厂方法的问题在于它是静态的并且不实现接口,因此不能用替代工厂实现替换它 . 但是,不同的 FactoryModuleBuilder 实例可以构建实现相同接口的不同工厂 .

2 回答

  • 0

    Spring没有与Guice FactoryModuleBuilder 相同的东西 . 最接近的等价物是Spring @Configuration 类,它提供了一个工厂bean,它实现了一个工厂接口,该接口的方法接受来自应用程序的任意参数 . Spring容器可以将依赖项注入到 @Configuration 对象中,而该对象又可以提供给工厂构造函数 . 与 FactoryModuleBuilder 不同,Spring方法产生了许多工厂实现典型的样板代码 .

    例:

    public class Vehicle {
    }
    
    public class Car extends Vehicle {
        private final int numberOfPassengers;
    
        public Car(int numberOfPassengers) {
            this.numberOfPassengers = numberOfPassengers;
        } 
    }
    
    public interface VehicleFactory {
        Vehicle createPassengerVehicle(int numberOfPassengers);
    }
    
    @Configuration
    public class CarFactoryConfiguration {
        @Bean
        VehicleFactory carFactory() {
            return new VehicleFactory() {
                @Override
                Vehicle createPassengerVehicle(int numberOfPassengers) {
                    return new Car(numberOfPassengers);
                }
            };
        }
    }
    
  • 5

    我不完全确定这个问题是一个骗局,(只有90%肯定),但这个答案:

    https://stackoverflow.com/a/13243066/1768232

    似乎拥有您需要的信息 . 具体来说,你应该这样做:

    我通过从上下文中获取构造函数-arg中使用的bean实例,然后使用您在运行时使用的值填充它来实现它 . 当您获得工厂生成的bean时,此bean将用作参数 .

    public class X {
       public void callFactoryAndGetNewInstance() {
          User user = context.getBean("user");
          user.setSomethingUsefull(...);
          FileValidator validator = (FileValidator)context.getBean("fileValidator");
          ...
       }
    }
    

    我建议阅读整个答案 .

相关问题