利用Spring在开发项目时,主要有三种配置方式:
1. 单纯的xml方式
2. xml和注解的方式
3. javaconfig的方式
然而@Autowired从字面意思来讲的话是自动装配,是配置spring时的一个注解,在spring中,就是按照类型装配。
我们在spring中大多数情况是用@Autowired注入一个类中的成员变量装配,JavaBean,按照类型,通过set方法进行装配,set方法可以省略。
但是@Autowired可不仅仅能够注入成员变量,下面是底层原码
通过底层原码,我们可以看出,@Target这个注解就说明了他可以自动装配的类型都有:构造方法、方法、参数、字段和注解类型,只是在spring的开发中我们使用最多的就是字段,也就是一个类中的成员变量。
语法:@Autowired(属性名=“属性值”),如果不写就默认是注入的成员变量的名字
注意事项:
1. 此注解首先默认按照类型装配
2. 按照类型装配,容器中必须有一个类型与之匹配,如果没有,则报NoSuchBeanDeficitionException
3. 容器中有多个类与之匹配,则自动切换按名字装配,名字就是成员变量的名字,看容器中有无id,若没有,报NoUniqueBeanDefinitionException
讲到此处,想必对上面的原码多少有点疑惑,因为在@Autowired的原码中没有任何业务逻辑,只是有三个注解,但是有一个地方值得注意就是@interface,在查阅了一些资料后,也得到了答案。工作原理大概是下面这几个步骤:
1. 通过反射机制获取一个类的class对象,也就是这个被@Autowired修饰的字段的类型的字节码
2. 通过这个class对象去获取字段
3. 然后字段这个类Field提供了一些方法来获取这个字段的所有注解
4. 拿到注解之后,判断这个注解是否是我们要实现的注解,如果是则实现注解逻辑
和@Autowired同级的注解还有很多,有的可以单独使用,有的必须依赖@Autowired,搭配使用。
比如@Qualifier(value = “注入的id”)
表示按名字装配,必须和@Autowired搭配使用,不能单独使用。
还有@Resource(name = “ 注入的id”)
按名字装配,修饰成员变量
可以单独使用,可以直接代替@Autowired和@Qualifier的搭配