博客
关于我
Spring里面的ioc拓展
阅读量:355 次
发布时间:2019-03-04

本文共 3869 字,大约阅读时间需要 12 分钟。

Spring IOC 是 Spring 应用程序中最核心的功能之一,它负责管理对象的生命周期及其依赖关系。通过IOC容器,开发者可以注入对象的依赖,实现松耦合的设计。然而,Spring 不仅提供了基础的依赖注入功能,还扩展了多种处理器,允许开发者在容器内部进行灵活操作。以下将详细介绍这些扩展功能及其应用场景。

Bean 在 IOC 容器中的生命周期

IOC 容器通过BeanDefinition来定义Bean的配置信息。当第一次从容器中获取Bean时,容器会根据BeanDefinition的配置信息实例化Bean。这个过程包括解析Bean类的构造函数、初始化参数等。创建完成的Bean会被存储在单列Bean缓存中,以备下一次请求时直接使用。

IOC容器的本质是一个基于Map的内存结构,用于存储Bean的名称与对应的BeanDefinition。每次调用getBean方法都会触发Bean的创建和初始化过程。

IOC 容容器的扩展处理器

Spring 提供了多种处理器,允许开发者在不同阶段对Bean进行操作。这些处理器通过实现特定的接口来注册到容器中,按照特定的顺序执行。

BeanDefinitionRegistryPostProcessor

这个处理器用于在Bean的注入操作之前对容器中的Bean进行统一处理。常见的使用场景包括动态加载自定义Bean,或者对某些特殊Bean进行手动注入。以下是使用这个处理器的一种典型场景:

package com.sise.config;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.beans.factory.support.BeanDefinitionRegistry;import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;import org.springframework.context.annotation.ClassPathBeanDefinitionScanner;import org.springframework.core.type.filter.AnnotationTypeFilter;import org.springframework.stereotype.Component;@Componentpublic class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {    @Override    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {        System.out.println("动态加载bean进入ioc容器里面");        ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);        scanner.addIncludeFilter(new AnnotationTypeFilter(MyBean.class));        scanner.scan("com.sise.bean");    }}

BeanFactoryPostProcessor

BeanFactoryPostProcessor 是另一种处理器,主要用于在Bean注入之前对容器中的Bean进行校验或初始化操作。例如,可以在注入前检查Bean的必要条件,或者进行一些准备工作。以下是一个示例:

package com.sise.config;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanFactoryPostProcessor;import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;import org.springframework.stereotype.Component;@Componentpublic class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {    @Override    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {        System.out.println("在加入ioc容器之前需要进行的处理");        String[] beanNameArr = beanFactory.getBeanDefinitionNames();        for (String name : beanNameArr) {            if (name.equals("user")) {                System.out.println("加载了user类对象");            }        }    }}

BeanPostProcessor

BeanPostProcessor 是处理Bean注入之后的处理器,主要用于对已经注入的Bean进行后续操作。例如,可以在Bean初始化之后对其属性进行一些处理,或者在Bean销毁前清理资源。以下是一个示例:

package com.sise.config;import org.springframework.beans.BeansException;import org.springframework.beans.factory.config.BeanPostProcessor;import org.springframework.stereotype.Component;@Componentpublic class MyBeanPostProcessor implements BeanPostProcessor {    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {        if (bean.getClass().getAnnotation(MyBean.class) != null) {            System.out.println("beanName:" + beanName);        }        return bean;    }    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {        if (bean.getClass().getAnnotation(MyBean.class) != null) {            System.out.println("beanName:" + beanName);        }        return bean;    }}

BeanPostProcessor 与 BeanFactoryPostProcessor 的区别

BeanPostProcessor 和 BeanFactoryPostProcessor 的主要区别在于它们的执行阶段。BeanFactoryPostProcessor 用于在Bean注入之前对容器中的Bean进行处理,而 BeanPostProcessor 则用于在Bean注入之后对已经注入的Bean进行处理。选择使用哪种处理器取决于具体的业务需求。

IOC 容器的扩展功能

通过这些处理器,Spring IOC容器提供了高度的灵活性。开发者可以根据项目需求,在Bean的注入过程中添加额外的处理逻辑。例如,在某些特定场景下需要对Bean的初始化过程进行定制化操作,或者在Bean注入后对其状态进行校验。

这些扩展功能使得Spring IOC 不仅仅是一个依赖注入框架,更成为了一个高度可定制化的容器化解决方案。通过对这些处理器的使用,开发者可以在容器内部进行更多元化的操作,提升项目的灵活性和可维护性。

转载地址:http://yzte.baihongyu.com/

你可能感兴趣的文章
Objective-C实现prefix conversions前缀转换算法(附完整源码)
查看>>
Objective-C实现pressure conversions压力转换算法(附完整源码)
查看>>
Objective-C实现Prim 算法生成图的最小生成树MST算法(附完整源码)
查看>>
Objective-C实现prime sieve eratosthenes埃拉托斯特尼素数筛选法算法(附完整源码)
查看>>
Objective-C实现PrimeCheck函数算法 (附完整源码)
查看>>
Objective-C实现PrimeFactors质因子分解算法 (附完整源码)
查看>>
Objective-C实现prim普里姆算法(附完整源码)
查看>>
Objective-C实现PriorityQueue优先队列算法(附完整源码)
查看>>
Objective-C实现proth number普罗斯数算法(附完整源码)
查看>>
Objective-C实现pythagoras哥拉斯算法(附完整源码)
查看>>
Objective-C实现QLearning算法(附完整源码)
查看>>
Objective-C实现QR正交三角分解法算法(附完整源码)
查看>>
Objective-C实现qubit measure量子位测量算法(附完整源码)
查看>>
Objective-C实现Queue队列算法(附完整源码)
查看>>
Objective-C实现Queue队列算法(附完整源码)
查看>>
Objective-C实现quick select快速选择算法(附完整源码)
查看>>
Objective-C实现rabin-karp算法(附完整源码)
查看>>
Objective-C实现radians弧度制算法(附完整源码)
查看>>
Objective-C实现radianToDegree弧度到度算法(附完整源码)
查看>>
Objective-C实现radix sort基数排序算法(附完整源码)
查看>>