文章目录
依赖注入(DI)
1.1 案例
1.1 创建Service接口和实现类
public interface DeptService {
void save();
}
@Service
public class DeptServiceImpl implements DeptService {
@Override
public void save() {
deptDao.save();
}
}
1.2 在Service中获取dao对象
//@Autowired 表示依赖自动注入,标注在属性上;
//Spring见到这个注解之后,就会自动在自己的容器中根据被标注属性的类型(DeptDao)进行查找被标注属性需要的值
@Autowired
private DeptDao deptDao;
1.3 测试
//获取service
@Test
public void test4(){
//1.读取配置类的信息,初始化Spring容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
//2.从容器中获取service对象
DeptService deptService = context.getBean(DeptService.class);
System.out.println(deptService);
}
2. 细节
2.1 @Autowired
@Autowired注解,默认是按照类型进行属性的赋值,如果存在多个相同类型的bean,就会报错
@Autowired 表示依赖自动注入,标注在属性上;
Spring见到这个注解之后,就会自动在自己的容器中根据被标注属性的类型(DeptDao)进行查找被标注属性需要的值
1.找不到 NoSuchBeanDefinitionException
2.找到一个 自动完成注入
3.找到多个 NoUniqueBeanDefinitionException
2.2 @Qualifier
跟@Autowired联合使用,标注在要赋值的属性上,代表在按照类型匹配的基础上,再按照指定名称匹配
@Autowired
@Qualifier("deptDaoImpl2")//此注解必须跟@Autowired配合使用,作用就是当使用@Autowired匹配到多个时,,再使用此注解指定对象id
private DeptDao deptDao;
2.3 @Primary
@Primary标注在实现类上,表示当一个接口有多个实现的类时,默认使用哪个作为主实现
@Repository("deptDaoImpl")
@Primary //标注在接口下实现类上,将此类的对象声明当前接口下的主要对象.注意:一个接口下只能有一个@Primary注解
public class DeptDaoImpl implements DeptDao {
//添加一个无参函数,用于测试对象创建时间
public DeptDaoImpl() {
System.out.println("对象创建");
}
@Override
public void save() {
System.out.println("保存成功");
}
}