@Autowired注解
@Autowired注解
@Autowired 字段
我们可以把 @Autowired
注解标注在类文件中的字段属性上,通过这种方式,Spring 容器启动的时候会查找相应的 Bean
,然后通过反射的方式注入到这个字段中。
例子如下:
@Controller
public class PayController {
@Autowired
PayService aliPayService;
}
这种方式使用起来非常方便,而且对于字段的要求也比较低,它可以是 public
,也可以是 private
范围。
日常编程中,我一般是直接使用这种方式,简洁又便利。
@Autowired 构造方法
第二种方式,我们可以使用类中的构造函数注入相应属性,例子如下:
@Controller
public class PayController {
PayService aliPayService;
@Autowired
public PayController(PayService aliPayService) {
this.aliPayService = aliPayService;
}
}
@Autowired
构造方法里的传参,可以是一个,也可以是多个。如果是多个参数,那 Spring 一起都注入进来。
@Controller
public class PayController {
PayService aliPayService;
OrderService orderService;
@Autowired
public PayController(PayService aliPayService, OrderService orderService) {
this.aliPayService = aliPayService;
this.orderService=orderService;
}
}
这种方式在注入多个属性的时候用起来还是比较方便的。
那其实有一种情况下,如果一个类不存在无参的构造函数,只存在有参的构造函数,那实际上我们即使不用 @Autowired
标注,Spring 也会帮我们注入相应的属性。
@Autowired 方法
第三种方式,我们可以通过方法注入相应属性,例子如下:
@Controller
public class PayController {
PayService aliPayService;
@Autowired
public void setAliPayService(PayService aliPayService) {
this.aliPayService = aliPayService;
}
}
那之前我一直以为这种方式只能使用 setxxx
才可以成功的注入属性 ,那其实是我理解错了,这个方法可以任意的命名。
那方法注入,其实跟构造方法一样,也可以同时有多个传参,Spring 将会把这些属性一起注入。
@Autowired与@Resource区别
@Autowired
1.@Autowired只有一个属性required,默认值为true,为true时,找不到就抛异常,为false时,找不到就赋值为null
2.@Autowired按类型查找,如果该类型的bean不唯一,则抛出异常;可通过组合注解解决·
@Autowired()@Qualifier("baseDao")
@Resource
@Resource有两个常用属性name、type,所以分4种情况
1.指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常
2.指定name:通过name找到唯一的bean,找不到抛出异常
3.指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
4.都不指定:通过字段名作为key去查找,找到则赋值;找不到则再通过字段类型去查找,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
不同点
1.Resource是JDK提供的,而Autowired是Spring提供的
2.Resource不允许找不到bean的情况,而Autowired允许(@Autowired(required = false))
3.指定name的方式不一样,@Resource(name = “baseDao”),@Autowired()@Qualifier(“baseDao”)
4.Resource默认通过name查找,而Autowired默认通过type查找
学习来源:
微信公众号:CodeSheep