1.项目结构
2.两个模拟用的注解(Service,Autowrid)
package com.madg.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 模拟Spring中的Autowrid
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowrid {
}
package com.madg.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 模拟Spring中的Service注解
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Service {
}
3. 用于模拟待注入的实体类
package com.madg.entity;
/**
* 实体类,后期用于注入到容器
*/
public class SayClass {
public void say()
{
System.out.println("goodbye world");
}
}
4. 核心类,模拟Spring的IoC功能
package com.madg.reflact;
import com.madg.annotation.Autowrid;
import com.madg.annotation.Service;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* 整个核心,模拟将数据装进容器(此处用list表示容器)
*/
public class Refection {
//装载用的容器
List
5.模拟注入
package com.madg.main;
import com.madg.annotation.Autowrid;
import com.madg.annotation.Service;
import com.madg.entity.SayClass;
/**
* 模拟注入
*/
@Service
public class SayService {
@Autowrid
SayClass sayClass;
public void say(){
sayClass.say();
}
}
6.测试
package com.madg.main;
import com.madg.entity.SayClass;
import com.madg.reflact.Refection;
import org.junit.jupiter.api.Test;
class MainTest {
@Test
void say() {
/**
* 模拟启动时加载
*/
SayService service=new SayService();
Refection refection=new Refection();
try {
/**
* 模拟启动时加载
*/
refection.ref(service);
/**
* 模拟装载完成后从容器中获取已经装载的类的实例
* 此处写的比较简单,因为知道只注入了一个实例
*/
Object o=refection.getList().get(0);
SayClass sayClass=(SayClass)o;
/**
* 调用该实例,不会报错NullPointer错误,则证明已经完成Ioc
*/
sayClass.say();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
}
}
}
7.输出