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;