如何获取带参数化构造的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
相关产品推荐
相关产品推荐

