准备内容
(1)创建ApplicationContext容器
包括configClass属性,构造方法和getBean方法
(2)创建CompentScan和Compent注解
@rentenion(RUNTIME)和@Target(Element.TYPE)
(3)创建Test、AppConfig和UserServce类
扫描逻辑模拟实现
(1)初始化时读取CompentScan注解的内容
(2)使用容器的类加载器加载对应路径
(3)对路径内容处理获得com.service.XXX.class格式
(4)加载出相应的类
注解的路径名(com.hu.service)——>获得类加载的绝对路径(com/hu/service)——>获得类名(com.hu.srvice.UserService)——>加载类(com.hu.srvice,UserService)
(5)创建BeanDefinition类,包含class,scope;
并在ApplicationContext中创建beanDefinitionMap
(6)判断当前加载的类是否带有Component注解,若有将class和scope设置好后放入beanDefinitionMap
(7)遍历beanDefinitionMap,将所有的singleton单例bean生成并放入singletonObjects;
创建bean时通过beanDefinition中class反射构造方法创建对象
(8)getBean实现——先判断beanName是否在beanDefinitionMap内,若有且为单例bean,取出singletonObjects中的对象,若为原型bean则新生成一个
依赖注入实现
(1)创建OrderServic类,并在UserService类中增加OrderService属性
(2)创建Autowired注解,并在UserService中的OrderService上增加注解
(3)在创建bean时,扫描创建出对象的所有属性,如果有Autowired注解,则通过getBean方法获得对象,并赋给新创建对象
Aware回调机制
(1)创建BeanNameAware接口类,并创建一个方法
(2)在UserService中实现该方法
(3)在createBean中增加判断,如果当前对象实现了BeanNameAware,则调用BeanNameAware的方法
初始化机制实现
(1)创建InitializingBean接口类,并创建方法
void afterPropertiesSet() throws Exception;
(2)在UserService中实现该方法
(3)在createBean中增加判断,如果当前对象实现了InitializingBean,则调用BeanNameAware的方法
BeanPostProcessor
(1)创建BeanPostProcessor接口类,并创建方法
Object postProcessBeforeInitialization(Object bean, String beanName);
Object postProcessAfterInitializatioin(Object bean, String beanName);
(2)创建HuBeanPostProcessor接口实现BeanPostProcessor
(3)在HuBeanPostProcessor类上增加Component注解
(4)在扫描时如果当前类是实现BeanPostProcessor,将加载出来的类放入beanPostProcessorList中
(5)在初始化前后遍历beanPostProcessorList,调用postProcessBeforeInitialization和postProcessAfterInitializatioin方法