理解Bean注入
1.1 定义服务Service
public class UserService {
}
1.2 在服务中引入Service
public class UserController {
private UserService userService;
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
1.3 编写注入方法
public class TestSetInjection {
public static void main(String[] args) throws Exception{
UserController userController = new UserController();
UserService userService = new UserService();
System.out.println(userService);
// 将userService注入到userController中
// 1. 获取class对象
Class<? extends UserController> clazz = userController.getClass();
// 2. 获取属性
Field userServiceField = clazz.getDeclaredField("userService");
// 也可以不设置可见性
userServiceField.setAccessible(true);
// 3. 获取对应的set方法
String name = userServiceField.getName();
String methodName = "set" + name.substring(0,1).toUpperCase() + name.substring(1,name.length());
Method method = clazz.getMethod(methodName, UserService.class);
// 4. 调用setUserService方法
method.invoke(userController, userService);
System.out.println(userController.getUserService());
}
}
理解Autowired
1.1 编写自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
@Documented
public @interface Autowired {
}
1.2 编写Service
public class UserService {
}
1.3 编写Controller自动织入Service
public class UserController {
@Autowired
private UserService userService;
public UserService getUserService() {
return userService;
}
}
1.4 编写工厂方法注入bean
public class TestAutowired {
public static void main(String[] args){
UserController userController = new UserController();
// 获取clazz对象
Class<? extends UserController> clazz = userController.getClass();
Stream.of(clazz.getDeclaredFields()).forEach(
field -> {
// 判断属性是否有注解
Autowired annotation = field.getAnnotation(Autowired.class);
if(annotation != null){
field.setAccessible(true);
// 获取当前属性的类型,有了类型可以创建具体的对象
Class<?> type = field.getType();
// 创建对象
try {
// 类似于demo1中的new Service
Object instance = type.newInstance();
// 给属性赋值
field.set(userController, instance);
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
);
System.out.println(userController.getUserService());
}
}
网友评论