天天看点

spring的自动装配

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作用在方法上,该方法的参数也会按照类型进行自动装配,然后按照变量名进行装配,和上面介绍的是一样的