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

如何使用@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 问题是构造函数被使用,因此必须是“可见的”。有没有办法

  • 我正在使用TestNG和Selenium WebDriver为webapp编写测试套件。 我需要的是为不同的经过身份验证的用户多次运行测试类的所有方法(数据在运行时从数据库中取出)。因此,我需要将一个数据传递给带有数据提供者的类,该类提供所有用户的凭据,然后为每个用户创建一个web驱动程序(为了实验的纯度),并在方法中使用提供的凭据进行验证,运行该类的所有方法,并制作一个分解关闭web驱动程序。