使用Java容器配置的Spring依赖项注入
我不熟悉Java和Spring,来自C#和.NET世界,所以请耐心听我说——我所尝试的可能是不正确的 我试图使用Java配置和注释来配置SpringDI,而不是XML配置,但是我遇到了一些问题。这是用于独立应用程序,而不是web应用程序。我已经完成了,就我所知,我的基本配置应该是正确的…但不是。请看下面的代码: Java配置注释类: 配置实现ISightingsProcessor接口的组件: 连接注释ConfigApplicationContext并测试: SightingsProcessor未被setter注入,并且由于返回的对象为null,断言失败。希望我错过了一些非常明显的东西 提前谢谢 针对Meriton进行编辑: 谢谢你的回答,梅里顿 为什么Spring不知道新创建的对象?Spring是否在整个应用程序生命周期中维护依赖关系,并在创建配置为bean的新对象时适当地进行注入 我不想直接使用使用Java容器配置的Spring依赖项注入,java,spring,dependency-injection,Java,Spring,Dependency Injection,我不熟悉Java和Spring,来自C#和.NET世界,所以请耐心听我说——我所尝试的可能是不正确的 我试图使用Java配置和注释来配置SpringDI,而不是XML配置,但是我遇到了一些问题。这是用于独立应用程序,而不是web应用程序。我已经完成了,就我所知,我的基本配置应该是正确的…但不是。请看下面的代码: Java配置注释类: 配置实现ISightingsProcessor接口的组件: 连接注释ConfigApplicationContext并测试: SightingsProcess
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);