【发布时间】:2019-07-28 02:20:33
【问题描述】:
我已经开始使用 spring data elasticsearch 并且一直在查看示例 here。
我无法理解 @Autowired 的工作原理。考虑以下几点:
IMessageProcessor.java:
package message.processor;
public interface IMessageProcessor {
void processMessage();
}
MyMessageProcessor.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);
}
}
MyMessageProcessorIT.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();
}
}
每当我运行单元测试时,MyMessageProcessor 中的articleService 始终是null。我需要额外的配置才能使自动装配工作吗?所有其他代码与上面链接的 github 存储库中的相同。
我如何确保在我需要使用ArticleServiceImpl 的项目中的任何位置都正确地自动连接?
我似乎有其他帖子有同样的问题,但似乎没有一个解决方案适用于我下面的示例。
【问题讨论】:
-
这是因为您正在使用
new关键字手动创建MyMessageProcessor的实例。在这种情况下,spring 容器没有创建msgProcessor实例对象,因此它没有机会向该对象注入ArticleServiceImpl的实例。您不应手动创建此实例。试试autowire吧。 -
因为你不允许用spring框架创建MyMessageProcessor,那是因为spring没有注入你的ArticleServiceImpl
标签: java spring spring-boot autowired spring-data-elasticsearch