我看到使用@Autowire注释注入ShopRepo是有效的,但是当我尝试使用xml时,它有时会起作用,有时它也不起作用(另外,intellij说我不能使用抽象bean作为属性) 。为什么它使用注释和xml配置并不总是有效(这是不同的)? 我怎样才能使它与xml配置一起工作?
代码如下所示:
public interface ShopRepo extends JpaRepository<Product, Long> {
@Override
Optional<Product> findById(Long aLong);
}
public class ShopController {
//@Autowired
private ShopRepo shopRepo;
public void setShopRepo(ShopRepo shopRepo) {
this.shopRepo = shopRepo;
}
public Product findProduct(Long id) {
return shopRepo.findById(1l).orElse(new Product());
}
}
<jpa:repositories base-package="com.example.shop.repository"/>
<bean id="shopRepo" class="com.example.shop.repository.ShopRepo" abstract="true"/>
<bean id="shopController" class="com.example.shop.controller.ShopController">
<property name="shopRepo" ref="shopRepo"/>
</bean>
答案 0 :(得分:1)
当您使用@Autowire时,您实际上是按类型进行自动装配。 @Autowire只是注入了shopRepo bean的实现。 shopRepo的实现由jpa存储库动态实例化,通常在spring容器的启动期间。
你的xml配置没有按类型进行任何自动装配,它试图将id为“shopRepo”的bean注入shopcontroller bean。 xml中的shopRepo定义只是一个定义,而不是jpa存储库创建的实际实现的名称。
您可以在xml文件中执行此操作。希望这可以帮助。
<bean id="shopRepo" class="com.example.shop.repository.ShopRepo" abstract="true"/>
<bean id="shopController" class="com.example.shop.controller.ShopController" autowire="byType">
</bean>