Spring注入Bean細節--解決Bean名稱重複問題

問題描述: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時要導正確的包
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章