应用程序如何通知Spring应用程序上下文在哪里找到构造函数使用@Inject注释的类?

时间:2016-05-27 19:47:03

标签: java spring dependency-injection jsr330

如何修复以下示例,以便通知Spring application context在何处查找构造函数使用@Inject注释的类Application,但没有将{bean}方法引入ApplicationConfiguration注释@Bean,返回类Application的实例?

public class Application {
    private final A a;

    @Inject
    public Application(A a) {
        this.a = a;
    }

    public A getA() {
        return a;
    }
}

@Configuration
public class ApplicationConfiguration {
    @Bean
    public A getA() {
        return new A();
    }
}

public class A {
}

public class Start {
    public static void main(String[] arguments) {
        final ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
        final Application application = context.getBean(Application.class);
        application.getA();
    }
}

您可以在AtInject上的GitHub项目中查看源代码。

当我运行类Start时,Spring抱怨它找不到类Application

May 27, 2016 4:49:55 PM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7eda2dbb: startup date [Fri May 27 16:49:55 EDT 2016]; root of context hierarchy
May 27, 2016 4:49:55 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.opessoftware.atinject.application.Application] is defined
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:371)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975)
    at com.opessoftware.atinject.start.Start.main(Start.java:11)

1 个答案:

答案 0 :(得分:1)

M. Deinumadvice之后,我使用构造型@Component注释了类Application,告诉Spring将Application视为bean和带注释的类{{ 1}} @ComponentScan以指示Spring在哪里找到组件ApplicationConfiguration

Application

请注意,我还修改了类@Component public class Application { private final A a; @Inject public Application(A a) { this.a = a; } public A getA() { return a; } } @Configuration @ComponentScan({"me.derekmahar.atinject.application", "me.derekmahar.atinject.model"}) public class ApplicationConfiguration { @Bean public A getA() { return new A("A1"); } } ,以便它接受名称:

A

班级public class A { private final String name; public A(String name) { this.name = name; } public String getName() { return name; } } 现在可以正确打印Start

"Name of a1 is "A1"."

您可以在AtInject上的GitHub项目中找到解决方案的源代码。