不爱吃鸭脖 不爱吃鸭脖
首页
Java
算法
k8s
日常
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

不爱吃鸭脖

小学生
首页
Java
算法
k8s
日常
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 私密连接
  • 手写一个简易RPC
  • 设计模式
  • 简易Spring
    • 定义一个简单的Spring容器
    • 运用设计模式,实现Bean的定义、注册、获取
    • 基于Cglib实现含构造函数的类实例化策略
    • 为Bean对象注入属性和依赖Bean的功能
    • 设计和实现资源加载器,从Spring解析和注册Bean对象
    • 实现应用上下文
    • 初始化和销毁方法
    • Aware感知容器对象
    • 对象作用域和FactoryBean
    • 容器事件和事件监听器
    • 基于JDK和Cglib动态代理,实现AOP核心功能
    • 把AOP动态代理,融入到Bean的生命周期
    • 通过注解配置和包自动扫描的方式完成Bean对象的注册
    • 通过注解给属性注入配置和Bean对象
    • 给代理对象的属性设置值
  • 牛客社区项目
  • idea快捷键
  • 实习技术
  • 其它
jinhua
2023-07-05
目录

简易Spring

# 容器篇IOC

# 定义一个简单的Spring容器

用于定义、存放和获取Bean对象。

  • 定义:BeanDefinition
  • 注册:我们把数据存放到HashMap中,存放的是定义了Bean的对象信息
  • 获取:最后是获取对象,Bean的名字就是key,Spring容器初始化好Bean之后,就可以直接获取了

# 运用设计模式,实现Bean的定义、注册、获取

  • 首先我们需要定义BeanFactory这样一个Bean工厂,提供Bean的获取方法getBean(String name),之后这个Bean工厂接口由抽象类AbstractBeanFactory实现。
  • 那么在继承抽象类AbstractBeanFactory后AbstractAutowireCapableBeanFactory 就可以实现相应的抽象方法了,因为AbstractAutowireCapableBeanFactory 本手也是一个抽象类,所以只会实现属于自己的抽象方法,其他抽象方法由继承AbstractAutowireCapableBeanFactory类实现

# 基于Cglib实现含构造函数的类实例化策略

  • 在BeanFactory中添加Object getBean(String name, Object... args)接口,这样就可以在获取Bean时把构造函数的入参信息传递进去
  • 这里有两种方式创建含有构造函数的Bean对象,一个是JDK自带的方法DeclaredConstructor,另一个是使用Cglib来创建Bean对象(enhancer,create(...))

# 为Bean对象注入属性和依赖Bean的功能

# 设计和实现资源加载器,从Spring解析和注册Bean对象

# 实现应用上下文

  • 满足于对 Bean 对象扩展的两个接口,其实也是 Spring 框架中非常具有重量级的两个接口:BeanFactoryProcessor和BeanPostProcessor,也几乎是在使用Spring框架之外自己组建需求的两个必备接口
  • BeanFactoryPostProcessor是Spring框架提供的容器扩展机制,允许在Bean对象注册后但未实例化前,对Bean的定义信息BeanDefinition进行修改操作。
  • BeanPostProcessor,也是Spring提供的扩展机制,不过是在Bean对象实例化之后修改Bean对象,也可以替换Bean对象,与后面的AOP有着密切关系
  • 同时如果只是添加这两个接口,不做任何包装,使用起来非常麻烦,开发Spring的上下文操作类,把相应的XML加载、注册以及新增的修改和扩展都融合进去,让Spring自己扫描到我们的新增服务,便于用户使用。

# 初始化和销毁方法

  • 在spring.xml配置中添加init-method、destory-method两个注解,在配置文件加载的过程中,把注解配置一并定义到BeanDefinition属性当中。这样在initializeBean初始化操作的工程中,就可以通过反射的方式来调用配置在Bean定义属性当中的方法信息了。另外如果是接口实现的方式,那么直接可以通过Bean对象调用对应接口定义的方法,afterPropertiesSet().
  • 除了在初始化做的操作外,destroy-method和DisposableBean接口的定义,都会在bean对象初始完成阶段,执行注册销毁方法的信息到 DefaultSingletonBeanRegistry 类中的 disposableBeans 属性里,这是为了后续统一进行操作。

# Aware感知容器对象

  • 定义接口Aware,在Spring框架中它是一种感知标记性接口,具体的子类去定义 和 实现感知容器的相关对象,也是通过这个桥梁,向具体的实现类中提供容器服务。
  • 继承Aware接口包括:BeanFactoryAware、BeanClassLoaderAware、BeanNameAware和ApplicationContextAware.

# 对象作用域和FactoryBean

  • FactoryBean 是 Spring 框架中的一个特殊接口,它是一个工厂Bean,用于创建和管理特定类型的对象。FactoryBean 接口允许开发人员自定义对象的创建逻辑,并将其纳入 Spring 的 IoC 容器管理。

# 容器事件和事件监听器

  • 基于观察者模式实现
  • 在Spring中有一个Event事件功能,可以提供事件的定义、发布以及监听事件来完成一些自定义的动作。比如可以定义一个新用户注册事件,当有用户执行注册完成后,在事件监听中给用户发送一些些优惠券和短信,这样就可以把注册和对应的策略服务分开,降低系统的耦合。以后还可以扩展注册服务,比如需要添加风控策略,添加实名认证、判断用户属性等等都不会影响到依赖注册成功后执行的动作。
  • 在整个功能实现过程中,仍然需要在面向用户的应用上下文 AbstractApplicationContext 中添加相关事件内容,包括:初始化事件发布者、注册事件监听器、发布容器刷新完成事件。
  • 使用观察者模式定义事件类、监听类、发布类,同时还需要完成一个广播器的功能,接收到事件推送时进行分析处理符合监听事件接受者感兴趣的事件,也就是使用 isAssignableFrom 进行判断。
  • isAssignableFrom 和 instanceof 相似,不过 isAssignableFrom 是用来判断子类和父类的关系的,或者接口的实现类和接口的关系的,默认所有的类的终极父类都是Object。如果A.isAssignableFrom(B)结果是true,证明B可以转换成为A,也就是A可以由B转换而来。
  • ApplicationEvent 是定义事件的抽象类,所有的事件包括关闭、刷新,以及用户自己实现的事件,都需要继承这个类。
  • ContextClosedEvent、ContextRefreshedEvent,分别是 Spring 框架自己实现的两个事件类,可以用于监听刷新和关闭动作。

# 代理篇AOP

# 基于JDK和Cglib动态代理,实现AOP核心功能

# 把AOP动态代理,融入到Bean的生命周期

# 通过注解配置和包自动扫描的方式完成Bean对象的注册

# 通过注解给属性注入配置和Bean对象

# 给代理对象的属性设置值

设计模式
牛客社区项目

← 设计模式 牛客社区项目→

最近更新
01
实习技术
08-24
02
sql
07-28
03
git命令
07-26
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Evan Xu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式