了解Spring源码
1.实现@Autowired
原理:反射
实验:
public class UserController {
// 注入
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
反射实现原理
public class MyTest {
/**
* 实现
*/
@Test
public void test() throws Exception {
// 获取userController的类模板
UserController userController = new UserController();
Class<? extends UserController> clazz = userController.getClass();
// 获取userService对象
UserService userService = new UserService();
System.out.println(userService);
// 获取所有的属性
Field serviceField = clazz.getDeclaredField("userService");
// 只有通过方法才能够设置具体的属性值, 直接set不行?
String name = serviceField.getName();
name = name.substring(0,1).toUpperCase()+name.substring(1,name.length());
String setMethodName = "set" + name; // 得到setUserService
//找到setUserService
Method method = clazz.getMethod(setMethodName, UserService.class);
// 反射,调用method给userController执行setUserService方法
method.invoke(userController, userService);
System.out.println(userController.getUserService());
}
}
结果