当执行如下代码时(配置文件中未注入)
private IAccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
运行时显示空指针异常
Autowired
作用:自动按照类型注入,只要容器中有唯一的一个bean对象类型和要注入的变量类型匹配,就可以注入成功。
出现位置:可以是成员变量上,也可以是方法上
@Autowired
private IAccountDao accountDao;
public void saveAccount() {
accountDao.saveAccount();
}
细节:在使用注解注入时,set方法就可以不是必须的了
SpringIOC容器时一个Map结构。Map的key是String类型的,Map的value是Object类型的,那目前我们的容器里面有Service对象,id是对应的key。同时还有dao的id(key)和对象(value)。我们容器中现在有这两个对象。我们要注入的变量是accountDao。
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的接口,此时就不止一个能匹配的上了。多个匹配应该是怎样的呢,默认情况会报错
试想,如果将前面的变量名改成
便可以运行成功
如果IOC容器中有多个类型匹配时,首先按照类型圈定出来匹配的对象,然后接下来会根据变量名称作为bean的id
在圈定出来的这两个里面继续查找,哪个跟他一样,如果有一样的,也可以注入成功,否则,就报错。
所以从这点上来说,要用autowired解决问题,要是两个bean都符合,就要改id,这显然不是我们想看见的。