default/no:不自动装配
byName: 根据名字进行装配,以属性名作为id,在容器中查找这个组件进行赋值
byType:根据类型进行装配
constructor: 使用构造器*
结果如下
找不到则直接赋值为null
这个是通过类型来进行装配。我们知道,不同的组件可以是同一个类型。如果有两个类型一致,那么装配谁呢?所以在使用时要注意是否有多个相同的类型
找不到也是直接赋值为null
试试两个相同的类型会发生什么
直接报错:Could not autowire. There is more than one bean of ‘Car’ type. Beans: car2,car. Properties: ‘car’ less… (Ctrl+F1)
在执行构造器装配时,会先按照有参构造器参数的类型进行装配,如果存在组件,则进行赋值,不存在,直接为null。如果按照类型找到多个呢?则按照名字进行匹配。
现在感觉每次都去配置文件中配置很麻烦,有没有更简单的呢?让IOC容器自动帮我们装配答案是使用注解。
在我们使用的类上面添加相应的注解,在配置文件中扫描我们需要的注解,然后进行自动的装配,省时省力啊~~~
@Autowired
原理:先按照类型进行匹配,匹配到一个直接进行注入,匹配到多个,再按照属性的变量名作为id进行匹配,然后在赋值。没有,抛异常。
测试一下
如果忘记其中的某一个注解的配置,会出现什么问题呢?
我们都可以猜测到,会出现空指针的异常
因为在MyService 中 myDao 没有进行属性的的注入,那么它就应该是null,调用null的方法肯定会出现空指针异常啊
作用就是让spring别用变量名作为id,取一个自定义的名字,当使用时,必须去找到,找不到,直接报错。
那如果我不想它报错呢?而是给我装配null
@Autowired(required = false) 默认时true,必须找到,找不到直接报错;改成false,不用必须找到,找不到,就null
Autowired作用在方法上,该方法的参数也会按照类型进行自动装配,然后按照变量名进行装配,和上面介绍的是一样的