手写IOC:实现效果

652 阅读1分钟

Bean的声明方式

通过编码方式进行声明

继承CodeDefinitionLoderRegistry类,重写loadBean()方法

public class MyCodeBeanDefinition extends CodeDefinitionLoaderRegistry {

    @Override
    public void loadBean() {
        this.register("BeanTest1", BeanTest1.class);
        this.register("BeanTest2", BeanTest2.class);
    }

}

然后编码使用register(bean的名称,bean所对应类)进行注册,和XML的声明方式是类似的。

通过注解@Bean的方式声明

@Bean
public class BeanTest1 implements BeanTest {

    @Override
    public void print() {
        System.out.println("BeanTest1");
    }

}

@Bean
public class BeanTest2 implements BeanTest {

    @Override
    public void print() {
        System.out.println("BeanTest2");
    }

}

获取Bean

从工厂中获取Bean

public static void foo() {

    // 第一步:c根据声明的方式选择 1 or 2
    // 方式一: 创建注册类,注册类中使用编码实现注册逻辑
    AbstractDefinitionLoaderRegistry registry = new MyCodeBeanDefinition();
    // 方式二: 创建注册类,Bean通过注解的方式自动注入
    AbstractDefinitionLoaderRegistry registry = new AnnotationDefinitionLoaderRegistry();
    
    // 第二步:注册类添加到工厂中
    ApplicationContext factory = new ApplicationContext(registry);

    // 第三步:获取Bean
    BeanTest obj1 = factory.getBeanInstance("BeanTest1", BeanTest1.class);
    BeanTest obj2 = factory.getBeanInstance("BeanTest2", BeanTest2.class);
    
    obj1.print();
    obj2.print();
}

通过注解自动注入Bean

使用@Autowired自动注入

@Bean
public class AutowiredTest {

    @Autowired
    public BeanTest1 beanTest1;
    @Autowired
    public BeanTest2 beanTest2;

    public void print1() {
        beanTest1.print();
    }

    public void print2() {
        beanTest2.print();
    }

}