Java bean非工作上下文的自动关联:组件扫描

Java bean非工作上下文的自动关联:组件扫描,java,spring,Java,Spring,玩弄原型。我有一个测试类,它自动连接一个JPARepository @ContextConfiguration("classpath:appContext-test.xml") @Transactional public class PersonRepositoryTest extends AbstractTransactionalJUnit4SpringContextTests { private static Logger logger = LoggerFactory.getLogg

玩弄原型。我有一个测试类,它自动连接一个JPARepository

@ContextConfiguration("classpath:appContext-test.xml")
@Transactional
public class PersonRepositoryTest extends AbstractTransactionalJUnit4SpringContextTests {
    private static Logger logger = LoggerFactory.getLogger(PersonRepositoryTest.class);

    @Autowired
    PersonRepository personRepository;
@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
    public List<Person> findByFirstNameAndLastName(String firstName,
            String lastName);

    @Query("select p from Person p where p.firstName = :firstName or p.lastName = :lastName")
    public List<Person> findByFirstNameOrLastName(
            @Param("firstName") String firstName,
            @Param("lastName") String lastName);

    public Page<Person> findAll(Pageable pageable);
}
我的appContext-test.xml可以很好地处理这个问题

<jpa:repositories base-package="com.mycompany.rd.misf.repository" /> 
但当我试图理解spring时,我认为这也可能有效。因此,我注释掉了jpa:repositories标签,并用以下内容补充了我的组件扫描:

<context:component-scan base-package="com.mycompany.rd.misf.model,com.mycompany.rd.misf.repository" />
我的存储库用@repository注释

@ContextConfiguration("classpath:appContext-test.xml")
@Transactional
public class PersonRepositoryTest extends AbstractTransactionalJUnit4SpringContextTests {
    private static Logger logger = LoggerFactory.getLogger(PersonRepositoryTest.class);

    @Autowired
    PersonRepository personRepository;
@Repository
public interface PersonRepository extends JpaRepository<Person, Long> {
    public List<Person> findByFirstNameAndLastName(String firstName,
            String lastName);

    @Query("select p from Person p where p.firstName = :firstName or p.lastName = :lastName")
    public List<Person> findByFirstNameOrLastName(
            @Param("firstName") String firstName,
            @Param("lastName") String lastName);

    public Page<Person> findAll(Pageable pageable);
}
但我也有例外:

无法自动关联字段: com.mycompany.rd.misp.repository.PersonRepository com.mycompany.rd.misp.repository.PersonRepositoryTest.personRepository; 嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 类型的限定bean 找到的[com.mycompany.rd.misp.repository.PersonRepository] 依赖项:至少需要1个符合autowire条件的bean 此依赖项的候选项。依赖项批注: {@org.springframework.beans.factory.annotation.Autowiredrequired=true}

为什么这不起作用

我已在appContext-text.xml文件中设置

谢谢你的帮助

问候


Spring JPA文档中对

[…]指示Spring进行扫描 com.acme.repositories及其接口扩展的所有子包 存储库或其子接口之一。对于找到的每个接口 基础设施注册特定于持久性技术的 FactoryBean创建处理调用的适当代理 查询方法的定义。每个bean都以一个 是从接口名派生的,因此是UserRepository的接口 将在userRepository下注册。基本包属性 允许使用通配符,以便您可以定义扫描模式 包裹

所以

您告诉Spring扫描指定的包及其子包中的组件、用@Component注释的类型及其专门化。如果找到任何带注释的类,Spring应该为它们创建一个bean定义


在您的例子中,它找到了@Component、@Repository的专门化,但它是一个接口,所以它不注册bean定义。在这种情况下,它完全不了解JPA

[…]指示Spring进行扫描 com.acme.repositories及其接口扩展的所有子包 存储库或其子接口之一。对于找到的每个接口 基础设施注册特定于持久性技术的 FactoryBean创建处理调用的适当代理 查询方法的定义。每个bean都以一个 是从接口名派生的,因此是UserRepository的接口 将在userRepository下注册。基本包属性 允许使用通配符,以便您可以定义扫描模式 包裹

所以

您告诉Spring扫描指定的包及其子包中的组件、用@Component注释的类型及其专门化。如果找到任何带注释的类,Spring应该为它们创建一个bean定义


在您的例子中,它找到了@Component、@Repository的专门化,但它是一个接口,所以它不注册bean定义。在这种情况下,它完全不了解JPA。

非常感谢,非常好的解释,非常感谢,非常好的解释,