4

我正在尝试创建一个 @Configuration 工厂 bean,它应该根据运行时参数创建其他(原型)bean。我想使用基于 java 的 spring 配置,但不知何故我无法让它工作。

这是一个例子:

enum PetType{CAT,DOG;}

abstract class Pet {    
}

@Component
@Scope("prototype")
class Cat extends Pet{
}

@Component
@Scope("prototype")
class dog extends Pet{
}

@Configuration
public class PetFactory{    
    @Bean
    @Scope("prototype")
    public Pet pet(PetType type){
        if(type == CAT){
            return new Cat();
        }else
            return new Dog();
    }
}

petFactory.animal(PetType.CAT);

我检查了 spring 文档和这里提出的所有相关问题,但我最终是在向创建的 bean 提供运行时参数的情况下结束的。而且我需要向必须使用它们来创建不同 bean 的工厂提供运行时参数。

编辑: 似乎(目前)没有办法将@Bean注释方法的参数定义为“运行时”。Spring 假定方法参数将用作新 bean 的构造函数参数,因此它尝试使用容器管理的 bean 来满足这种依赖关系。

4

3 回答 3

3

这似乎可以很好地利用 Spring Profiles 功能。您可以在此处阅读有关Java 配置的信息,并在此处阅读有关XML 配置文件的信息。

您的配置文件将定义一个 Pet bean。然后,您的工厂可以连接该 bean。

要修改您使用的配置文件,只需添加:-Dspring.profiles.active=dog 或 -Dspring.profiles.active=cat(或您命名的任何名称)。

于 2013-05-30T14:16:37.650 回答
1

尝试使用@Configurable:

class Factory {

    Pet newPetOfType(PetType type) {
        switch (type) {
            case CAT: return new Cat();
            ...
        }
    }

    @Configurable
    private static class Cat extends Pet {
        @Autowired private Prop prop;
        ...
    }
}
于 2013-05-30T20:40:10.910 回答
1

您可以将您的 PetFactory bean @Autowire放入所需的 bean 并在运行时调用具有所需类型的animal()方法,如下面的方法:

@Configuration    
public class AppConfiguration {

    @Bean
    @Scope("prototype")
    public Pet getPet(PetType type) {

        if(type == CAT){
            return new Cat();
        } else
            return new Dog();
    }

}

//...
// Then in required class
@Service
public class PetService {

    @Autowired
    private AppConfiguration configuration;

    //.....

    public Pet getPetByType(PetType type) {
        return configuration.getPet(type);
    }

}
于 2015-11-16T18:08:08.803 回答