Spring JavaConfig中的限定符

时间:2015-01-28 11:18:39

标签: spring inversion-of-control spring-java-config

我正在尝试编写一个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”异常。我做错了什么?

1 个答案:

答案 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注释。

希望这有帮助