Что эквивалентно автоматическому подключению интерфейса с аннотацией @Autowire в файле конфигурации XML? - PullRequest
0 голосов
/ 08 июня 2018

Я видел, что внедрение ShopRepo с аннотацией @Autowire работает, но когда я пытаюсь сделать это с xml, иногда это работает, а иногда нет (также, intellij говорит, что я не могу использовать абстрактный бин в качестве свойства).Почему он работает с аннотацией, а конфиг 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 голосов
/ 08 июня 2018

Когда вы используете @Autowire, вы на самом деле делаете autowire по типу.@Autowire просто внедряет реализацию bean-компонента shopRepo.Реализация shopRepo динамически создается в репозиториях jpa, обычно во время запуска контейнера Spring.

Ваша конфигурация xml не выполняет автоматическую разводку по типу, она пытается внедрить компонент с идентификатором "shopRepo" в компонент shopcontroller.Определение shopRepo в вашем xml - это просто определение, а не имя фактической реализации, созданной репозиторием 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>
...