Java 组件扫描找不到@Repository

Java 组件扫描找不到@Repository,java,spring,component-scan,Java,Spring,Component Scan,我的课程是这样的: 抽象道 package dao.impl; public abstract class AbstractDAO <E> implements DAO<E> { @PersistenceContext private EntityManager em; public void add(E entity) { em.persist(entity); } } 此代码是否应该能够自动连接我的itemDAO 当我运行测试时,它抛

我的课程是这样的: 抽象道

package dao.impl;
public abstract class AbstractDAO <E> implements DAO<E> {

@PersistenceContext
private EntityManager em;

   public void add(E entity) {
        em.persist(entity);
   }
}
此代码是否应该能够自动连接我的itemDAO

当我运行测试时,它抛出一个异常

org.springframework.beans.factory.BeanCreationException: Could not autowire 
field: private dao.impl.ItemDAOImpl service.impl.ItemTest.itemDAO; nested
exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [dao.impl.ItemDAOImpl] found for dependency: 
expected at least 1 bean which qualifies as autowire candidate for this
dependency. Dependency annotations: 

你能告诉我我错过了什么吗?我唯一能想到的是,因为我的测试在src/test/java中,所以application-context-test.xml在src/test/resources中,我的dao在src/main/java中。可能组件扫描的位置不对?

因为ItemDAOImpl用@Transactional注释,spring将为这个bean创建一个代理,并在自动连接时注入代理,而不是bean本身

Spring可以通过子类化(使用Cglib)或使用Jdk代理实现bean接口来创建代理。 spring使用哪种类型的代理取决于您的配置

我遇到了与您描述的类似的问题,原因是spring使用Jdk代理,而我没有意识到这一点

在您的例子中,ItemDaoImpl的Springbean将是实现DAO的代理。 这是不能注入的

@Autowired
private ItemDAOImpl itemDAO;
因为它不能转换为ItemDaoImpl。 这可以解释你面临的例外情况

要解决此问题,请将字段更改为

@Autowired
private DAO<Item> itemDAO;

因为ItemDAOImpl是用@Transactional注释的,所以spring将为这个bean创建一个代理,并在自动连接时注入代理,而不是bean本身

Spring可以通过子类化(使用Cglib)或使用Jdk代理实现bean接口来创建代理。 spring使用哪种类型的代理取决于您的配置

我遇到了与您描述的类似的问题,原因是spring使用Jdk代理,而我没有意识到这一点

在您的例子中,ItemDaoImpl的Springbean将是实现DAO的代理。 这是不能注入的

@Autowired
private ItemDAOImpl itemDAO;
因为它不能转换为ItemDaoImpl。 这可以解释你面临的例外情况

要解决此问题,请将字段更改为

@Autowired
private DAO<Item> itemDAO;

它非常有效,我尝试了两种方法,都成功了。谢谢Stefan,也谢谢你的解释。它非常有效,我尝试了两种方法,都成功了。谢谢Stefan,也谢谢你的解释。
@Autowired
private DAO<Item> itemDAO;
public interface ItemDAO extends DAO<Item>
@Autowired
private ItemDAO itemDAO;