我正在尝试编写一个JavaConfig文件,该文件将包含所有依赖项,以便能够选择注入的类。 例如,JavaConfig的一个函数
@Bean
@Qualifier("bigWheel") // Has no impact (I have several types of wheel)
public Car getCar(Wheel wheel){
return new Car(wheel);
}
当我用@Component标记Car类时,我得到了“No default constructor”异常。我做错了什么?
答案 0 :(得分:0)
你必须意识到,当Spring创建spring上下文并实例化bean时,它需要默认的构造函数,即没有任何参数的构造函数。很简单,它不知道什么轮供应。
我还认为您可能会因使用伪保留的get / set方法作为对象名称而感到不快。无论您使用限定符注释,您都要创建Car类的对象getCar。
看起来你有点想让getCar成为工厂方法吗?如果不是你正在做的事情,我不打算写一个大的描述。但如果是这样,你的模式需要一些工作。
编辑:从下面的评论中我真的不想在上下文创建时实例化bean。听起来你只需要一个可以使用汽车和轮子的常规Spring Aware bean。像这样的东西。
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
class Wheel {
... wheel stuff
}
@Component
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
class Car {
... car stuff
}
@Component
class Dealership extends ApplicationContextAware {
@Autowired
ApplicationContext applicationContext;
... bunch of dealership code
Wheel wheel = (Wheel) applicationContext.getBean("Wheel");
Car car = (Car) applicationContext.getBean("Car");
car.setWheel(wheel);
... profit
在上下文初始化过程中,它听起来并不像你正在寻找一个被注入全球单身车的全球单身车。
这就是为什么我在上面添加了SCOPE_PROTOTYPE注释。通常情况下,Spring会实例化一个对象,并在你调用它时继续攻击该对象。这在大多数情况下效果很好。但是,如果你的对象开始存储状态,或者你当然是多线程的,那就不行了。
但春天无法解决这个问题。因此,如果您希望为每个getBean调用实例化一个唯一对象,则必须添加@Scope注释。
希望这有帮助