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依赖注入是通过反射实现的