这相当于在XML配置文件中使用@Autowire注释自动装配接口?

时间:2018-06-08 09:59:10

标签: java xml spring spring-java-config xml-configuration

我看到使用@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>

1 个答案:

答案 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>