Spring管理的Bean對象可以採用自動裝配機制爲屬性賦值。基於註解方式進行自動裝配,一般使用@Autowired,@Qualifer,@Resource這些註解。
@Autowired修飾構造方法,set方法,屬性值
底層完成DI依賴注入操作是通過反射調用set方法,或者構造方法爲屬性賦值。
- @Autowired 可以修飾屬性,構造方法,set方法,默認依據類型(屬性類型,參數類型)爲屬性注入值.假如Spring容器中有多個相同類型的值,會參考名字進行匹配查找(屬性名,set方法參數名,構造方法參數名),假如名字有相同的則注入,沒有相同的會注入失敗.
- @Qualifier 配合@Autowired註解按名字爲屬性注入值.
- @Resource 可以修飾屬性或set方法,默認依據名字(屬性名,set方法名)爲屬性注入值.假如spring容器中有名字相同但類型不同的bean就會注入失敗,當沒有找到對應名字的bean對象,此時會依據類型再次進行查找,假如相同類型則
直接注入,當有多個相同類型可能會注入失敗(假如是按set方法進行注入,依據方法名字沒找到,還會按參數類型查找,對應類型有多個,還可能會按參數名查找,假如沒找對應的,則注入失敗).
這兩個要配合使用
package controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import service.SysLogService;
@Controller
public class SysLogController {
@Autowired
@Qualifier("sysLogService")
private SysLogService sysLogService;
public SysLogService getSysLogService() {
return sysLogService;
}
}
package service;
public interface SysLogService {
}
package service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import dao.SysLogDao;
import service.SysLogService;
/**
* <bean id="sysLogService" class="service.impl.SysLogServiceImpl">
* <property name="SysLogDao" ref="SysLogDaoImpl">
*</bean>
*/
@Service("sysLogService") //描述業務層對象,自己起的名字
//@Service //描述業務層對象
public class SysLogServiceImpl implements SysLogService {
//@Autowired
private SysLogDao sysLogDao;
public SysLogDao getSysLogDao() {
return sysLogDao;
}
@Autowired
public void setSysLogDao(SysLogDao sysLogDao) {
this.sysLogDao = sysLogDao;
}
}
package dao;
public interface SysLogDao {
}
package dao.impl;
import org.springframework.stereotype.Repository;
import dao.SysLogDao;
@Repository //這個註解修飾Dao層的對象
public class SysLogDaoImpl implements SysLogDao{
}
DI依賴注入是通過反射實現的