手写Spring学习

准备内容

(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方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值