应用程序如何通知 Spring 应用程序上下文在哪里可以找到其构造函数带有 @Inject 注释的 class?
How can an application inform the Spring application context where to find a class whose constructor is annotated with @Inject?
如何修复以下示例以通知 Spring application context where to find a class Application
whose constructor is annotated with @Inject
,但是 没有 将 bean 方法引入 ApplicationConfiguration
注释为 [=17] =] returns class 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 project on GitHub 中查看源代码。
当我运行classStart
,Spring抱怨找不到classApplication
:
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)
跟随 M. Deinum's , I annotated class Application
with stereotype @Component
to tell Spring to treat Application
as a bean and annotated class ApplicationConfiguration
with @ComponentScan
以指示 Spring 在哪里可以找到组件 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");
}
}
请注意,我还修改了 class A
以便它接受一个名称:
public class A {
private final String name;
public A(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Class Start
现在可以正确打印 "Name of a1 is "A1"."
:
May 30, 2016 11:14:49 AM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7eda2dbb: startup date [Mon May 30 11:14:49 EDT 2016]; root of context hierarchy
May 30, 2016 11:14:49 AM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Name of a1 is "A1".
中找到解决方案的源代码
如何修复以下示例以通知 Spring application context where to find a class Application
whose constructor is annotated with @Inject
,但是 没有 将 bean 方法引入 ApplicationConfiguration
注释为 [=17] =] returns class 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 project on GitHub 中查看源代码。
当我运行classStart
,Spring抱怨找不到classApplication
:
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)
跟随 M. Deinum's Application
with stereotype @Component
to tell Spring to treat Application
as a bean and annotated class ApplicationConfiguration
with @ComponentScan
以指示 Spring 在哪里可以找到组件 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");
}
}
请注意,我还修改了 class A
以便它接受一个名称:
public class A {
private final String name;
public A(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Class Start
现在可以正确打印 "Name of a1 is "A1"."
:
May 30, 2016 11:14:49 AM org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7eda2dbb: startup date [Mon May 30 11:14:49 EDT 2016]; root of context hierarchy
May 30, 2016 11:14:49 AM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor <init>
INFO: JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
Name of a1 is "A1".
中找到解决方案的源代码