前言介绍
@Autowired 可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作
手动实现
1. 新建一个普通Java工程
2.Autowired注解类
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
@Documented
public @interface Autowired {
}
3.UserController类
public class UserController {
@Autowired
private UserService userService;
public UserService getUserService() {
return userService;
}
}
4.UserService类
public class UserService {
private String name;
@Override
public String toString() {
return "UserService{" +
"name='" + name + '\'' +
'}';
}
}
5.利用反射实现注入
public class Test {
public static void main(String[] args) {
UserController userController = new UserController();
Class<? extends UserController> clazz = userController.getClass();
Stream.of(clazz.getDeclaredFields()).forEach(field -> {
// 对获取到的所有field进行遍历
// 判断每个属性是否有注解
Autowired annotation = field.getAnnotation(Autowired.class);
if (annotation != null){
field.setAccessible(true);
Class<?> type = field.getType();
// 实例化对象
Object o = null;
try {
// 获取userService对象
o = type.newInstance();
// 为userController的名为'userService'的属性设置新的值,即把属性值修改为对象o
field.set(userController,o);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
});
// 测试是否能获取到对象
System.out.println(userController.getUserService());
}
}
运行结果:
成功注入了userService对象