当执行如下代码时(配置文件中未注入)

private IAccountDao accountDao;
public void saveAccount() {
    accountDao.saveAccount();
}

运行时显示空指针异常

spring 自动注册的对象注入不进去_对象类型


Autowired
作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
出现位置:可以是成员变量上,也可以是方法上

@Autowired
private IAccountDao accountDao;
public void saveAccount() {
    accountDao.saveAccount();
}

spring 自动注册的对象注入不进去_对象类型_02


细节:在使用注解注入时,set方法就可以不是必须的了

spring 自动注册的对象注入不进去_spring 自动注册的对象注入不进去_03

SpringIOC容器时一个Map结构。Map的key是String类型的,Map的value是Object类型的,那目前我们的容器里面有Service对象,id是对应的key。同时还有dao的id(key)和对象(value)。我们容器中现在有这两个对象。我们要注入的变量是accountDao。

spring 自动注册的对象注入不进去_变量名_04


private是访问修饰符,IaccountDao叫数据类型,accountDao叫变量名称。null指的是数据类型。

Autowerd作用是自动按照类型注入,它是使用了IaccountDao,接下来直接在springIOC容器中找,跳过了key,直接看value。找到了IaccountDaoImpl(虽然是实现类,可以看成接口类型,就可以注入成功),就会把它注入到这个变量中来。

如果IOC容器中没有任何bean的类型和要注入的变量匹配,则报错

如果容器中有两个实现类

@Repository("accountDao2")
public class AccountDaoImpl2 implements IAccountDao {
    public void saveAccount() {
        System.out.println("保存了账户222222");
    }
}

此时又来了一个dao的实现类。也可以看成dao的接口,此时就不止一个能匹配的上了。多个匹配应该是怎样的呢,默认情况会报错

spring 自动注册的对象注入不进去_数据类型_05


试想,如果将前面的变量名改成

spring 自动注册的对象注入不进去_对象类型_06


便可以运行成功

spring 自动注册的对象注入不进去_对象类型_07


如果IOC容器中有多个类型匹配时,首先按照类型圈定出来匹配的对象,然后接下来会根据变量名称作为bean的id
在圈定出来的这两个里面继续查找,哪个跟他一样,如果有一样的,也可以注入成功,否则,就报错。

所以从这点上来说,要用autowired解决问题,要是两个bean都符合,就要改id,这显然不是我们想看见的。