5

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

4 回答 4

1

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

这里还有一些解释

于 2011-12-01T01:42:58.407 回答
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

于 2011-12-01T01:28:21.050 回答
0

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

于 2011-12-02T21:51:03.870 回答
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/>
于 2017-01-01T13:19:44.773 回答