Spring Service名称与Interface name冲突

时间:2018-06-04 10:02:37

标签: java spring spring-annotations

我有一个接口名称

public interface ScoreDao {

   public int storeScore(OverallScore overallScore);

   public void storeIndividualScore(ScoreTO scoreTO);
}

实现类如下所示

@Repository("scoreDao")
public class ScoreDaoImpl implements ScoreDao {
   @Override
   public int storeScore(OverallScore overallScore) {
      //Implementation 
   }
   @Override
   public void storeIndividualScore(ScoreTO scoreTO){
       //Implementation
   }
}

来电者正在使用以下服务

@Service("scoreService")
public class scoreServiceImpl implements IScoreService {
   @Autowired
   private ScoreDao scoreDao;

   @Override
   public int storeScore(OverallScore overallScore) {
      return scoreDao.storeOverallScore(overallScore);
   }

   @Override
   public void storeIndividualScore(ScoreTO scoreTO) {
      scoreDao.storeIndividualScore(scoreTO);
   }
}

我正在使用spring 4.x,而部署我遇到了bean冲突错误,如下所示。

  

引起:java.lang.RuntimeException:   org.springframework.context.annotation.ConflictingBeanDefinitionException:   bean类的注释指定bean名称'ScoreDao'[ScoreDao]   与现有的,不兼容的同名bean定义冲突   和班级[ScoreDaoImpl]

当我将界面名称更改为IScoreDao时,它正在运行。是否因为服务名称@Repository(“scoreDao”)与接口名称相同?

2 个答案:

答案 0 :(得分:4)

简单的答案是,这是因为您有一个名为-----END CERTIFICATE-----的界面,并且您将其实现为\r\n\

解决它的两种方法:

  1. ScoreDao重命名为其他名称

  2. @Repository("scoreDao")更改为ScoreDao,以便它将使用默认名称

答案 1 :(得分:0)

在您的界面上有另一个解决方案提及@Repository,因此您无需在实现类中提及,因为您实现了该接口。所以它使用接口名称自动创建bean。