自定义一个注解 MyAutowired
4个元注解自行百度
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface MyAutowired {
}
定义一个Controller,注入一个service
public class UserController {
@MyAutowired
private UserService userService;
public UserService getUserService() {
return userService;
}
}
测试类
public class MyIOCTest {
@Test
public void iocTest() throws Exception {
UserController userController = new UserController();
Class<? extends UserController> clazz = userController.getClass();
// 不能使用getFields方法,getFields只能获取public属性
Field[] fields = clazz.getDeclaredFields();
for (Field field: fields) {
// 设置属性可访问
field.setAccessible(true);
MyAutowired annotation = field.getAnnotation(MyAutowired.class);
if (annotation != null){
// 通过构造器获取实例
Object obj = field.getType().getConstructor(null).newInstance();
field.set(userController,obj);
}
}
System.out.println(userController.getUserService());
}
}
注意几点
- 不能使用getFields方法,getFields只能获取public属性
- 要设置属性可访问,否则访问不了私有属性
- getType获取属性的声明类型,然后获取构造器,通过构造器获取实例后注入
- 与真实的Spring IoC依然有些差别,spring里有一个容器初始化了所有的bean,然后注入时只需从容器拿就行了,上文是自己通过构造器初始化的。