Spring中能否运行时动态设置@Component的Bean名称为实例属性值
问题解答
原有代码语法修正
你提供的代码存在多处语法错误,修正后的版本如下:
public abstract class Vehicle{ private String vehicleName; // 构造方法无需class修饰符 public Vehicle(String vehicleName){ this.vehicleName = vehicleName; } // 抽象方法需添加abstract修饰 public abstract void drive(); } @Component("Car") // Car继承Vehicle而非实现,类名不能小写,类定义后不要加括号 public class Car extends Vehicle { public Car(String carName){ super(carName); } }
核心需求实现说明
你提出的「将Car类对应的Bean引用名称设置为Car类实例的carName属性值」的需求,无法直接通过原生@Component注解实现,原因如下:
- Spring中@Component注解对应的Bean名称是在Bean定义(BeanDefinition)注册阶段就确定的,这个阶段Spring还未完成对应类的实例化,无法获取到实例对象的carName属性值,所以不可能直接把实例属性值作为注解配置的Bean名称。
如果要达成类似效果,可以通过手动注册Bean的方式实现,操作步骤如下:
- 去掉Car类上的
@Component注解,不再交由Spring自动扫描注册 - 当你创建Car实例后,手动将其注册到Spring容器中,示例代码如下:
// 自定义carName值创建Car实例 String customCarName = "benzG63"; Car car = new Car(customCarName); // 如果Car实例需要注入其他Spring管理的依赖,先执行自动装配 applicationContext.getAutowireCapableBeanFactory().autowireBean(car); // 手动将实例注册为Spring Bean,Bean名称设置为carName属性值 applicationContext.getBeanFactory().registerSingleton(customCarName, car);
注册完成后,你就可以通过applicationContext.getBean(customCarName)获取到对应的Car实例。
注意事项
- Spring容器内的Bean名称全局唯一,你需要保证所有Car实例的carName值不会重复,否则注册时会抛出Bean定义冲突异常
- 如果不需要Car实例依赖注入其他Spring Bean,可以省略自动装配的步骤
内容的提问来源于stack exchange,提问作者Rahul Nehul
相关产品推荐
相关产品推荐

