1.@Autowired 默认按类型装配 (这个注解是属于 spring 的), 默认情况下必须要求依赖对象必须存在, 如果要允许 null 值, 可以设置它的 required 属性为 false, 如:@Autowired(required=false) , 如果我们想使用名称装配可以结合 @Qualifier 注解进行使用, 如下:
- @Autowired()
- @Qualifier("baseDao")
- private BaseDao baseDao;
2.@Resource(这个注解属于 J2EE 的), 分为以下几种情况
1) 默认安照名称进行装配, 名称可以通过 name 属性进行指定
如:
- @Resource(name="student") // 这里的 student 是指 bean 的 ID
- private Student student;
2) 如果没有指定 name 属性, 当注解写在字段上时, 默认取字段名进行按照名称查找
如:
- @Resource() // 未指定 name, 默认取将要注入属性的字段名, 如下 Student 是类类型, student 是属性名也就是字段名
- private Student student;
3) 如果注解写在 setter 方法上默认取属性名进行装配.
如:
- @Resource(name="student")
- public void setStudent(Student student) {
- this.student = student;
- }
4) 当找不到与名称匹配的 bean 时才按照类型进行装配.
如:
java 代码如下:
- @Resource()
- private Student student;
spring.xml 如下:
- <bean id="student1" class="com.spring.chapter8.Student">
- <property name="name" value="张三"></property>
- <property name="age" value="23"></property>
- </bean>
在 Spring.xml 文件中并没有 student 的 bean. 当找不到与名称匹配的 bean 时才按照类型进行装配. 我们运行也会成功.
但是需要注意的是, 如果 name 属性一旦指定, 就只会按照名称进行装配. 否则会报错
运行结果如下:
spring.xml 如下:
java 代码如下:
运行结果:
总结:
1.@Resource 注解既可以用在 setter 中也可以用在属性当中, 当 Resource 指定属性 name 名字时, 就只会按照指定的 name 去查找 bean, 否则会报错.
2. 当注解写在字段上时,@Resource 不指定 name, 默认取字段名进行按照名称查找, 如果注解写在 setter 方法上默认取属性名进行装配. 如果最后都找不到与名称匹配的 bean 时才按照类型进行装配. 我们运行也会成功
3. 推荐使用:@Resource 注解在字段上, 且这个注解是属于 J2EE 的, 减少了与 spring 的耦合. 最重要的这样代码看起就比较优雅.
来源: https://www.cnblogs.com/ysource/p/12826250.html