最简spring IOC实现

public class Main {
    public static void main(String[] args) throws Exception {
        Class<Address> addressClass = Address.class;
        Constructor<Address> declaredConstructor = addressClass.getDeclaredConstructor();
        Field field1 = addressClass.getDeclaredField("address");
        field1.setAccessible(true);
        MyValue myValue = field1.getAnnotation(MyValue.class);
        String value = myValue.value();
        Address address = declaredConstructor.newInstance();
        field1.set(address, value);
        field1.setAccessible(false);
        MyComponent annotation1 = addressClass.getAnnotation(MyComponent.class);

        Map<String, Object> container = new HashMap<>();
        container.put(annotation1.name(), address);

        Class<MyService> myServiceClass = MyService.class;
        Constructor<MyService> declaredConstructor1 = myServiceClass.getDeclaredConstructor();
        MyService myService = declaredConstructor1.newInstance();

        Field field2 = myServiceClass.getDeclaredField("name");
        field2.setAccessible(true);
        MyValue annotation = field2.getAnnotation(MyValue.class);
        field2.set(myService, annotation.value());
        field2.setAccessible(false);

        Field field3 = myServiceClass.getDeclaredField("address");
        field3.setAccessible(true);
        field3.set(myService, container.get(field3.getAnnotation(MyResource.class).name()));
        field3.setAccessible(false);

        container.put(myServiceClass.getAnnotation(MyComponent.class).name(), myService);

        for (Map.Entry<String, Object> entry : container.entrySet()) {
            String key = entry.getKey();
            Object value1 = entry.getValue();
            System.out.println(key + " => " + value1);
        }
    }
}

@MyComponent(name="myService")
class MyService {
    @MyValue(value="yury")
    private String name;
    @MyResource(name="address")
    private Address address;

    @Override
    public String toString() {
        return "MyService{" +
                "name='" + name + '\'' +
                ", address=" + address +
                '}';
    }
}

@MyComponent(name="address")
class Address {
    @MyValue(value="shanghai")
    private String address;

    @Override
    public String toString() {
        return "Address{" +
                "address='" + address + '\'' +
                '}';
    }
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyComponent {
    String name();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyValue {
    String value();
}

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyResource {
    String name();
}
posted @ 2022-06-29 19:43  yury757  阅读(24)  评论(0)    收藏  举报