zoukankan      html  css  js  c++  java
  • spring扩展点总结

    看spring源码,搞明白流程,最终还是要知道spring中有哪些可以扩展的地方。流程是死的,扩展点是活的,在不修改源码的前提下,只有搞明白spring有哪些扩展点,才能根据需求灵活的完成编码工作。

    BeanFactory构造阶段

    有一个NamespaceHandler可扩展的地方。

    NamespaceHandler

    通过自定义的NamespaceHandler,配合BeanDefinitionParser,可以完成自定义Bean的组装操作,对于BeanDefinition的数据结构,进行个性化创建。

    红线处是MyBatis的NamespaceHandler,和原始的接口名重了而已。(MyBatis的Mapper接口BeanDefination扫描,还可以使用MapperScannerConfigurer,在BeanFactoryPostProcessor执行中、Bean实例化前实现)

    Dubbo在spring中的使用,就有NamespaceHandler的身影。

    还有目前常用的component-scan,也是利用ComponentScanBeanDefinitionParser完成了指定包下所有类的扫描,BeanDefinition创建的过程。

    ApplicationContext构造阶段

    有两个可扩展的地方:BeanFactoryPostProcessor,BeanPostProcessor。

    BeanFactoryPostProcessor

    拥有一个接口方法:

    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

    实现BeanFactoryPostProcessor的Bean,ApplicationContext会提前实例化,并使用BeanFactoryPostProcessor对BeanFactory中的BeanDefinition进行变化修改,或者创建BeanDefinition到BeanFactory中。

    比如PropertyPlaceholderConfigurer可将property-placeholder中的配置文件信息替换到BeanDefinition中。

    比如ConfigurationClassPostProcessor发现BeanFactory中使用了@Configuration注解的Bean,并根据此Bean在BeanFactory中增加Bean。

    比如MyBatis中使用的MapperScannerConfigurer,扫描basePackage配置下的接口,生成多个Bean并注册到BeanFactory中。

    BeanPostProcessor

    拥有两个接口方法:

    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

    分别在Bean实例初始化之前和之后执行,可自定义修改Bean实例,甚至替换Bean实例为自定义实例。

    此外还有四个接口继承了BeanPostProcessor接口。

    DestructionAwareBeanPostProcessor

    接口有一个方法,在实例销毁前使用。

    InstantiationAwareBeanPostProcessor

    接口有三个方法,两个在实例创建前后(不是初始化前后)使用,一个是在populateBean变量注入时使用。

    Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
    boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
    PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
    • 其中实例创建前后使用的接口,可检查是否已使用AOP代理创建了实例。并返回创建的实例,之后的Bean实例创建步骤便不会继续执行了。
    • 变量注入使用的接口,可实现@Autowired注解的注入。

    注:常见的AbstractAutoProxyCreator真正产生代理实例的地方是在postProcessAfterInitialization中,AOP也是通过此种方式和IOC过程连接起来的。http://www.ithao123.cn/content-6051885.html

    SmartInstantiationAwareBeanPostProcessor

    接口有三个方法,在实例创建前智能判断实例类型,智能判断构造函数,获取预创建实例,防止循环依赖。

    实现了InstantiationAwareBeanPostProcessor接口的类,基本都实现了SmartInstantiationAwareBeanPostProcessor接口。

    MergedBeanDefinitionPostProcessor

    接口有一个方法,在实例创建前,修改合并BeanDefinition。

    看了一下几个实现类,除了调用BeanDefinition.registerExternallyManagedDestroyMethod方法外,没有修改过BeanDefinition的其他内容。

  • 相关阅读:
    ansible语法
    hadoop本地模式安装及配置
    linux免密钥登录
    ansible配置文件
    ansible(安装)
    elasticsearch基本概念
    elasticsearch基本概念
    elasticsearch倒排索引介绍
    Flex tree展开节点问题!
    Oracle-Trigger-Insert tableA and tableB
  • 原文地址:https://www.cnblogs.com/mahuan2/p/7232372.html
Copyright © 2011-2022 走看看