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