基于注解的DI 之 @Resource
JDK 注解@Resource 自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解可以按名称匹配 Bean,也可以按类型匹配 Bean。默认是按名称注入(默认byName)。使用该注解,要求 JDK 必须是 6 及以上版本。@Resource 可在属性上,也可在 set 方法上。
(1)byType 注入引用类型属性
@Resource 注解若不带任何参数,采用默认按名称的方式注入,按名称不能注入 bean,则会按照类型进行 Bean 的匹配注入。
定义一个School类
package com.apps.pojo06;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* @author hk Email:2113438464@qq.com
* @ClassName School
* @Description : 实体类
* @date 2021/6/7
*/
@Component("mySchool")
public class School {
@Value("大云汉第二分校")
private String name;
@Value("广东")
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
定义Student类
package com.apps.pojo06;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author hk Email:2113438464@qq.com
* @ClassName Student
* @Description : 实体类
* @date 2021/6/7
*/
//省略value
@Component("myStudent")
public class Student {
/**
* @Value: 简单类型的属性赋值
*/
@Value("张德帅")
private String name;
@Value(value = "23")
private Integer age;
//默认是byName:先使用byName自动注入,如果byName失败,再使用byType
//@Resource
//使用byType,byName失败,使用byType
@Resource
private School school;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}
(2)byName 注入引用类型属性
package com.apps.pojo06;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author hk Email:2113438464@qq.com
* @ClassName Student
* @Description : 实体类
* @date 2021/6/7
*/
//省略value
@Component("myStudent")
public class Student {
/**
* @Value: 简单类型的属性赋值
*/
@Value("张德帅")
private String name;
@Value(value = "23")
private Integer age;
/**
* @Resource: 使用byName ,需要增加一个属性name
* name值是bean(名称)
*/
//默认是byName:先使用byName自动注入,如果byName失败,再使用byType
//@Resource
//使用byName,byName成功,不会使用byType
@Resource(name = "mySchool")
private School school;
public Student() {
}
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
System.out.println("setAge:"+age);
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", school=" + school +
'}';
}
}