简述@Autowired底层原理

利用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的搭配

猜你喜欢

转载自blog.csdn.net/m0_48011056/article/details/126917726