Spring @Autowired构造函数给出没有找到默认构造函数

时间:2011-12-01 00:54:48

标签: java spring autowired default-constructor

Spring 3.0中出现了一些奇怪的行为。

package com.service.schedule;

import org.springframework.stereotype.Component;

@Component("outroJob")
public class OutroJob {

    public void printMe() {
        System.out.println("running...");
    }

}

package com.service.schedule;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Component;

@Component("testeAutowired")
public class TesteAutowired {

    @Autowired
    public TesteAutowired(OutroJob outroJob) {
        outroJob.printMe();
    }

    public static void main(String[] args) {
        ClassPathResource res = new ClassPathResource("applicationContext.xml");
        XmlBeanFactory ctx = new XmlBeanFactory(res);

        OutroJob outroJob = (OutroJob) ctx.getBean("outroJob");
        outroJob.printMe(); // gives: running...

        ctx.getBean("testeAutowired");
    }
}

这些bean都没有在applicationContext.xml上声明

所以,行outroJob.printMe();工作正常...打印“正在运行......”

但是当我试图获得“testeAutowired”bean时,它说:

  

无法实例化bean类   [com.service.schedule.TesteAutowired]:找不到默认构造函数;   嵌套异常是java.lang.NoSuchMethodException:   com.service.schedule.TesteAutowired。

问题是:为什么,如果Spring找到了“outroJob”bean,它不会在TesteAutowired构造函数上自动启动它?

显而易见的是......

4 个答案:

答案 0 :(得分:1)

尝试使用ApplicationContext而不是XmlBeanFactory。 XmlBeanFactory不会对注释进行后处理,即不使用AutowiredAnnotationBeanPostProcessor来解释您遇到的行为。

Here's some more explanation

答案 1 :(得分:0)

尝试使用

@Autowired(required=true)
public TesteAutowired(OutroJob outroJob) {
    outroJob.printMe();
}

这应该强制Spring使用该构造函数。否则,它会构建一个构造函数列表并选择最佳候选者。显然它真的想要一个默认构造函数作为候选者,我想。

参考:http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/AutowiredAnnotationBeanPostProcessor.html

答案 2 :(得分:0)

为组件创建一个接口,并尝试使用自动装配的构造函数自动装配接口和nore该类。

答案 3 :(得分:0)

我收到相同的错误消息,但有不同的问题。我正在使用XML配置并将@Autowired放在类构造函数上。

我通过在XML配置文件中启用注释驱动配置来修复此问题:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">


    <context:annotation-config/>