前言:平常使用这个两个注解的时候就是相当然的使用,没有去具体比价两者的区别,在网上查阅了资料,加自己测试后,记录一下。
首先,这个两个注解都是用来完成组件的装配的,即利用依赖注入(DI),完成对ioc容器当中各个组件之间依赖的装配赋值
1.@Autowire
@Autowire
Employee employee;
这是spring提供的一个注解,,默认是按照类型装配(by-type),要求容器中一定要有这个类型的对象,如果没有将会报错,抛出异常。也可以通过设置可以@Autowired(required = false)
,来告诉容器,如果没有,可以不注入。
- 当容器中有多个相同类型的对象,会报错,可以通过
@Qualifier("beanname")
,来指定装配哪个对象的id。或者用@Primay 如下图所示:
@Qualifier(value = "employee1")
@Autowired
Employee employee;
1.@Resource
@Resource
Employee employee;
@Resource注解是属于J2EE的一个注解,他可以设置 by-name 和by-type来进行自动装配。
- 当设置了
name
和type
即:@Resource(name = "employee", type = "Employee.class")
,根据设置的条件到ioc中注入唯一的 对象 - 当只设置了
name
,则按照name,装配,如果没有那么抛出异常。 - 当只设置了
type
,那么按照类型装配,如果ioc容器当中存在多个,或不存在,抛出异常。 - 如果
name
和type
都没有指定,那么先按by-name查找,(如果 @Autowire注解标注在对象上 by-name查找的值 是对象的字段名,在方法上,则是参数的名),如果by-name 没查找到,那么就进行 by-type查找。如果都没查找到,那么抛出异常。
总结:
- @Autowire通过by-type装配,如果有多个,可以通过@Qualifier指定。 (属于spring的注解)
- @Resource,可以by-type ,也可以by-name,如果指定了 则按照指定装配,都没指定 先by-name 后by-type (属于J2EE中注解)