You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取带参数化构造的Prototype Bean并设置不同薪资值

实现不同薪资的Programmer Prototype实例方案

你可以通过以下几种无XML的方式创建带有不同薪资的Programmer实例:

1. 直接通过BeanFactory获取实例

Spring的BeanFactory支持传入构造参数获取Prototype Bean,调用getBean方法并传入salary值即可:

@Autowired
private BeanFactory beanFactory;

// 获取不同薪资的实例
Programmer dev1 = beanFactory.getBean(Programmer.class, 8000);
Programmer dev2 = beanFactory.getBean(Programmer.class, 12000);

说明:由于Programmer已标记为@Component且是Prototype作用域,BeanFactory每次调用都会创建新实例,自动将传入的salary作为构造参数注入,同时完成Computer依赖的自动装配。

2. 使用ObjectProvider(Spring 4.3+推荐)

ObjectProvider是BeanFactory的轻量级替代,更适配依赖注入场景,支持带参数的实例获取:

@Autowired
private ObjectProvider<Programmer> programmerProvider;

// 创建实例
Programmer dev1 = programmerProvider.getObject(8000);
Programmer dev2 = programmerProvider.getObject(12000);

说明:该方式逻辑与BeanFactory一致,但更契合Spring依赖注入规范,避免直接依赖BeanFactory接口。

3. 自定义带参数的@Bean工厂方法

如果需要在配置类中集中管理Bean创建逻辑,可以给@Bean方法添加参数,Spring会自动解析并传入所需值:

@Configuration
@ComponentScan("com.classbasedconfig")
public class AppConfig {

    @Bean
    @Scope("prototype")
    public Programmer programmer(int salary) {
        return new Programmer(salary);
    }
}

使用时同样通过BeanFactory或ObjectProvider传入参数:

Programmer dev = beanFactory.getBean(Programmer.class, 10000);

说明:这种方式保留了声明式配置的特点,同时支持动态传参,适合需要统一管理Bean创建规则的场景。

注意事项

  • Programmer类的@Component注解和自定义@Bean方法二选一即可,避免重复注册Bean。
  • Prototype作用域保证每次获取都会生成新实例,每个实例的salary相互独立,Spring会自动处理@Autowired标记的Computer依赖注入。

内容的提问来源于stack exchange,提问作者Sahil Singh Rawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:08