使用Java容器配置的Spring依赖项注入

使用Java容器配置的Spring依赖项注入,java,spring,dependency-injection,Java,Spring,Dependency Injection,我不熟悉Java和Spring,来自C#和.NET世界,所以请耐心听我说——我所尝试的可能是不正确的 我试图使用Java配置和注释来配置SpringDI,而不是XML配置,但是我遇到了一些问题。这是用于独立应用程序,而不是web应用程序。我已经完成了,就我所知,我的基本配置应该是正确的…但不是。请看下面的代码: Java配置注释类: 配置实现ISightingsProcessor接口的组件: 连接注释ConfigApplicationContext并测试: SightingsProcess

我不熟悉Java和Spring,来自C#和.NET世界,所以请耐心听我说——我所尝试的可能是不正确的

我试图使用Java配置和注释来配置SpringDI,而不是XML配置,但是我遇到了一些问题。这是用于独立应用程序,而不是web应用程序。我已经完成了,就我所知,我的基本配置应该是正确的…但不是。请看下面的代码:

Java配置注释类:

配置实现ISightingsProcessor接口的组件:

连接注释ConfigApplicationContext并测试:

SightingsProcessor未被setter注入,并且由于返回的对象为null,断言失败。希望我错过了一些非常明显的东西

提前谢谢

针对Meriton进行编辑:

谢谢你的回答,梅里顿

为什么Spring不知道新创建的对象?Spring是否在整个应用程序生命周期中维护依赖关系,并在创建配置为bean的新对象时适当地进行注入

我不想直接使用
context.getBean(ISightingsProcessor.class)
老实说,如果我能帮助它,我希望在没有手动干预的情况下将依赖注入setter方法中-它看起来更干净

我使用的是
ProcessorFactory
,因为
IsightingProcessor
接口扩展了
Runnable
——实现对象将作为线程启动。应用程序将可配置为具有n个线程,每个线程在循环迭代中启动。我认为在方法声明中有
@Autowired
注释是不可能的(我可能错了,如果是的话,请给出建议),因此我使用工厂来提供注入的
IsightingProcessor
具体类的一个新实例

是的,我刚刚看了一下
@Scope
注释-你说得对,需要转到
AppConfig
@Bean
声明(我在本次编辑中已经完成了),谢谢

ISightingsProcessor processor = new ProcessorFactory().getSightingsProcessor();
这将调用ProcessorFactory的构造函数,然后调用构造函数创建的实例的getter。Spring无法了解新创建的对象,因此无法注入其依赖项。您应该向Spring请求ProcessorFactory,例如

ProcessorFactory pf = context.getBean(ProcessorFactory.class);
ISightingsProcessor processor = pf.getSightingsProcessor();
也就是说,我完全不知道为什么需要类ProcessorFactory。您不妨直接获取ISightingsProcessor:

ISightingsProcessor processor = context.getBean(ISightingsProcessor.class);
此外,“基于Java的配置”和组件扫描是声明bean的独立方式。目前,您需要两次声明ISightingsProcessor:一次使用@Bean注释工厂方法,一次使用类上的组件扫描和@component注释。做这两件事都可以。事实上,两者都做可能会导致一个bean定义覆盖另一个bean定义


哦,
@Scope
注释用于bean定义(您用
@bean
@Component
注释的定义)。注入点(
@Autowired
)上可能会忽略它。

是否应该在ProcessFactory中针对SightingsProcessor成员设置@Resource注释?如果静态DI正常工作,它与
ProcessorFactory
中的非静态
IsightingProcessor
实例相关(尽管有
@Scope
注释)。梅里顿你确实是对的。只是在这个问题上绊倒了一下,摇了摇头
@Test
public void testProcessingDI(){
    @SuppressWarnings("resource")
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
    context.register(AppConfig.class);
    context.refresh();


    ISightingsProcessor processor = new ProcessorFactory().getSightingsProcessor();
    System.out.println(processor);
    Assert.assertTrue(processor != null);
}
ISightingsProcessor processor = new ProcessorFactory().getSightingsProcessor();
ProcessorFactory pf = context.getBean(ProcessorFactory.class);
ISightingsProcessor processor = pf.getSightingsProcessor();
ISightingsProcessor processor = context.getBean(ISightingsProcessor.class);