目录
一、@AutoWired注解是什么?
@AutoWired 是Spring提供的注解,默认注入方式为byType(按类型自动注入)。
替换:autowire属性,自动装配(按照类型装配,通过set方法,且方法可以省略)
<property></property>
<constructor-age></constructor-age>
位置:修饰属性,set方法
语法:@Autowired(required="true")
autowire=“属性值”=======》局部
default-autowire=“属性值”=======》全局
注意:1.如果容器中没有一个可以与之匹配且required属性为true则会报异常
NoSuchBeanDefinitionException
2.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称装配
3.如果容器中有多个可以类型可以与之匹配,则自动切换为按照名称装配,如果名称也没有匹配,则报异常 NoUniqueBeanDefinitionException
一、注解用法
根据@Autowired注解的源码,可以看到该注解可以作用在构造器、参数、方法、属性,都是从容器中获取参数组件的值
标注在方法上:@Bean+方法参数,参数从容器中获取,默认不写@Autowired效果是一样的,都能自动装配
标注在构造器上:如果组件上只有一个有参构造,这个有参构造的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取
标注在参数位置
标注在属性位置
二、自动装配
Spring利用依赖注入(DI)完成对IOC容器中各个组件的依赖关系赋值
@Autowired自动注入(Spring提供的):
默认优先按照去容器中找对应的组件:applicationContext.getBean()
如果找到多个相同类型的组件,再将属性的名称作为组件的ID去容器中查找
@Qualifier()注解:该注解指定需要装配的组件ID,而不是使用属性名
自动装配默认必须要对属性赋值,没有就会报错,可以使用@Autowired(required = false)指定非必须就不会报错
@Primary注解:自动装配时当出现多个bean候选者时,被注解为@Primary的bean将作为首选者,否则将抛出异常,如果使用了@Qualifier()指定装配的bean,则还是使用明确指定装配的bean
@Resource(JSR250)和@Inject(JSR330)(JDK提供的)
@Resource:
默认按照组件名称进行装配,也可以指定名称进行装配
当找不到与名称匹配的bean会按类型装配
不支持@Primary和@Autowired(required = false)功能
如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
@Inject:
需要导入javax.inject的包,和Autowired功能一样,但是没有required=false功能
三、@Autowired和@Resource注解的区别
@Autowired由Spring提供,只按照byType注入;@Resource由J2EE提供,默认按照byName自动注入,当找不到与名称匹配的bean会按类型装配
@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性为false。如果想使用名称装配可以结合@Qualifier注解进行使用。
@Resource,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

本文详细介绍了Spring框架中的@Autowired注解,包括其默认按类型装配的特性,以及如何通过@Qualifier和@Primary进行精确匹配。同时,对比了@Resource注解,强调了其按名称装配的默认行为。此外,还探讨了自动装配的各种场景和可能遇到的问题,如多个匹配项时的处理策略。
3121

被折叠的 条评论
为什么被折叠?



