問題描述:org.springframework.context.annotation.ConflictingBeanDefinitionException
問題原因:在使用註解配置Bean的過程中,存在名稱相同的情況,導致項目啓動失敗
解決辦法:
1)在配置實例化註解時,指定別名
在mapper中使用@Repository註解來指定別名
//項目其他包中也存在相同的類名稱DepartmentMapper,這裏使用value來指定別名
//正常情況下,因爲配置文件中已經配置了mapper包的掃描,所以可以省略@Repository註解,如果發生上述衝突,考慮使用別名來解決
@Repository(value="DepartmentMapper2")
public interface DepartmentMapper {
//此處省略各種CRUD方法
}
2)在Service中指定所依賴的mapper
//這裏也指定了service的別名
@Service(value="DepartmentService2")
public class DepartmentServiceImpl implements DepartmentService{
//這裏指定依賴哪一個Mapper,默認情況下使用ByName按類名來指定
@Resource(name="DepartmentMapper2")
private DepartmentMapper departmentMapper;
//省略各種service方法
}
如果service的類名也衝突了怎麼辦?
在service中,使用@Service配置在實現類上,如果指定別名,可以利用value屬性來指定,另外,@Service中默認括號中的字符串即是value的值,所以value可以省略
@Service("DepartmentService2")
對應Controller
@Resource(name="DepartmentService2")
private DepartmentService departmentService;
小結
在配置Bean的過程中所指定的別名相當於以往XML中Bean屬性id的值
<bean id="beanname" class="xxx.xxx.Xxx"></bean>
再複習@Resource這個註解
//@Resource注入順序: 1.同時指定name和type,那麼按照byname和bytype匹配唯一符合條件的bean裝配
// 2.指定name或者type,則按照指定方式匹配,默認按name匹配,一旦指定type則不再使用屬性名匹配
// 3.如果都不指定,則按照屬性名(屬性名爲類名首字母小寫)匹配,如果沒有匹配到,按照屬性數據類型匹配
// 以上不匹配則拋出異常
//@Resource 默認按照ByName注入Bean
//也就是尋找id爲“DepartmentService”的Bean
@Resource
private DepartmentService departmentService;
//所以可以指定name屬性來改變默認規則
//這樣就尋找id爲“DepartmentService2”的Bean
@Resource(name="DepartmentService2")
private DepartmentService departmentService;
//也可以那個指定class來使用ByType注入
@Resource(type=DepartmentService.class)
private DepartmentService departmentService;
//注意import時要導正確的包