当前位置: 首页 > 知识库问答 >
问题:

如何使用@Bean方法根据运行时参数提供不同的bean

穆招
2023-03-14

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

这里有一个例子:

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来满足这种依赖。

共有3个答案

壤驷华美
2023-03-14

您可以将您的PetFactory bean自动连接到所需bean中,并在运行时调用具有所需类型的动物()方法,如以下方法:

@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);
    }

}
赵景曜
2023-03-14

尝试使用@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;
        ...
    }
}
贲言
2023-03-14

这似乎可以很好地利用Spring Profiles功能。在这里,您可以阅读Java配置,在这里,您可以阅读XML配置文件。

你的个人资料将定义一个宠物豆。然后你的工厂就可以把豆子接进去了。

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

 类似资料:
  • 问题内容: 我想在gradle中定义一个任务(称为),该任务运行gradle任务,但具有的固定值。我也希望以后可以使用原始任务。 我的问题是,我无法转移清单的设置。 我累了 我以为我要通过对archiveName和manifest使用其他值来重新定义任务。 运行时会生成一个可执行的JAR文件。 运行时会生成一个jar文件。不幸的是,当尝试使用我运行程序时,出现错误消息: java -jar bui

  • 我是Spring框架的新手,找不到实现以下内容的方法: 我正在使用一个类,它的属性都是私有的,没有设置器(使用该类对象的预期方式是用构造函数设置一次属性)-我将它称为首选项。我还有几个类,每个类都有相同的首选项实例作为属性。首选项旨在包含某些属性,其中一些只能在运行时解析(例如由用户提供)。

  • 问题内容: 我正在编写的代码()包括让每个客户在处理的特定时间点插入自己的计算器的功能。这是为了允许自定义业务规则。至此,计算已经完成,我们知道了很多事情,其中​​有些可能与计算有关。 将为一组特定的输入参数创建并运行一次。 我的计划是使用依赖注入在构造函数中给出一个。这允许不同的用户插入自己的。该会返回一个表示为这个特殊的运行支付的附加费的数额。其他人将实现各种计算器,我需要能够更新我的代码而不

  • null 目前,我已经为运行应用程序配置了postgres,并通过在和中使用不同的配置了用于测试的h2 对于这些场景,更改数据库连接信息的最简单方法是什么?

  • 在我的spring boot应用程序中,我有一个“普通”的单例bean,它通过一个私有构造函数“自动连接”他们需要的东西。因此,不可能在代码中的任何地方调用“new”。 但我也有需要创建运行时参数的“原型”bean。为了创建这样的bean,我可以使用这种方法(惰性实例化的protype bean):带有运行时构造函数参数的Springbean 问题是构造函数被使用,因此必须是“可见的”。有没有办法

  • 对于我目前的项目,我正在制作一张表格,让我能够跟踪我的D 现在,我可以分别为每个单元格进行适当的数据验证。在我的ref tables表中,我有一个部分,它将获取字符类值,并将所有“subclass”选项放入一行。然后,我可以使用特定单元格中的数据验证来获取子类行。这是可行的,但对每个单元格来说都很乏味。 我想放在范围部分的公式是 它用适当的列追加行号,这样每一行都会自动获得自己的子类行(例如:Re