这是我参与8月更文挑战的第25天,活动详情查看:8月更文挑战
依赖 注入
- 依赖指的是Bean之间的依赖
- 比如我们养了狗狗,那么让狗狗去看门,或者利用xxx去做什么
public interface Person{
// 让动物做事情的服务
public void service();
// 设置动物
public void setAnim(Anim animal);
}
public interface Anim{
public void use();
}
- 上面一个是人的接口,一个是动物的接口
@Component
public class APerson implement Person {
@Autowired
private Anim anim = null;
@Override
public void service() {
this.anim.user();
}
@Override
public void setAnim(Anim animal) {
this.anim = animal;
}
}
public class Dog implement Anim {
@Override
public void use() {
System.out.println("狗是用来看门的 + 「」" + Dog.class.getSimpleName);
}
}
- 这里有两个实现类,在APerson中使用了
@Autowired注解 - 此注解会根据属性的类型然后去找到相应的Bean注入
- 而这里面狗狗(Dog)类是动物的一种,所以Spring ioc容器会将Dog的实例注入到Aperson中,
- 那么这样就可以通过Spring ioc容器来过去Aperson实例的时候
- 就可以使用Dog类来服务
@Autowired
- @Autowired注解就是根据类型来注入,那么想到ioc中的getBen来获取Bean,
- 它有各种不同的getBean,也是根据类型或者名称来获取
- 但是当我们如果有一只猫又注入到我们的容器中,就会有两个动物,所以ioc容器会抛出异常
- spring为了消除二义性,就产生了两个注解@Primary和@ Quelifier
- @Primary注解就是当产生二义性的时候,优先使用有此注解的实例进行注入
- @Quelifier注解后面可以附上标注如@Quelifier("cat")一旦这样使用,ioc就会以类型和名称去寻找
生命周期
Bean的定义过程
- 通过配置以后,@ComponentScan会根据扫描路径去找到带有@Component的类 可以称为定位
- 找到资源后就开始解析,并且将定义的信息保存起来,此时还没初始化Bean,仅仅是定义
- 然后就将Bean定义发布到ioc容器中,此时还没生成Bean的实例
- 此时是资源定位和Bean的定义发布到ioc容器的过程
- 此后spring就会完成Bean的实例化和依赖注入
在创建Bean的实例对象时就是实例化的时候 在使用@Autowired的时候就是依赖注入的时候