这个问题在这里已有答案:
我已经开始玩spring数据弹性搜索,并一直在查看示例here。
我无法理解@Autowired
的工作原理。考虑以下:
iMessage processor.Java:
package message.processor;
public interface IMessageProcessor {
void processMessage();
}
my message processor.Java
package message.processor;
@Component
public class MyMessageProcessor implements IMessageProcessor {
@Autowired
private ArticleServiceImpl articleService;
private final Author johnSmith = new Author("John Smith");
private final Author johnDoe = new Author("John Doe");
@Override
public void processMessage() {
Article article = new Article("Spring Data Elasticsearch");
article.setAuthors(asList(johnSmith, johnDoe));
article.setTags("elasticsearch", "spring data");
articleService.save(article);
}
}
my message processor IT.Java
package message.processor;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class MyMessageProcessorIT {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Before
public void before() {
elasticsearchTemplate.deleteIndex(Article.class);
elasticsearchTemplate.createIndex(Article.class);
}
@Test
void testProcessMessage() {
MyMessageProcessor msgProcessor = new MyMessageProcessor();
msgProcessor.processMessage();
}
}
每当我进行单元测试时,articleService
中的MyMessageProcessor
总是null
。我是否需要额外的配置才能使自动装配工作?所有其他代码与上面链接的github repo中的代码相同。
我如何确保在我的项目中我需要使用ArticleServiceImpl
,它是否正确自动装配?
我似乎有其他帖子有相同的问题,但没有一个解决方案似乎适用于我的下面的例子。
您没有使用Spring创建的MyMessageProcessor实例并在此行上创建自己的实例。
MyMessageProcessor msgProcessor = new MyMessageProcessor();
您应该在测试类中自动装配MyMessageProcessor。
因为你不允许用spring框架创建MyMessageProcessor,因为spring不会注入你的ArticleServiceImpl
@Configuration
public class Configuration {
@Bean
public MyMessageProcessor mymessageProcessor() {
return new MyMessageProcessor();
}
}
然后在测试类中@Autowire MyMessageProcessor
@PCL,你帖子中的第一个评论链接提供了完整的答案,但在你的代码中你有两个选择:1 - 把MyMessageProcessor msgProcessor
自动装配:
package message.processor;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Config.class)
public class MyMessageProcessorIT {
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private MyMessageProcessor msgProcessor;
...
@Test
void testProcessMessage() {
msgProcessor.processMessage();
}
}
或者,您获取应用程序上下文并手动自动装配bean,在@Tom提供的链接中,您可以看到这样的链接具有手动bean查找。如果要创建新bean,那么applicationContext也有一个autowire方法。
最好的问候,大卫