Spring IOC中各类角色介绍

BeanFactory:基础IOC容器

ApplicationContext:高级应用程序IOC容器(扩展至BeanFactory,包含BeanFactory的所有特性)
org.springframework.context.support.AbstractApplicationContext:refresh方法包含容器启动刷新的顺序逻辑

BeanDefinitionReader:由BeanDefinitionReader的相应实现类负责将相应的配置文件内容读取并映射到BeanDefinition,然后将映射后的BeanDefinition注册到一个BeanDefinitionRegistry

BeanDefinition:BeanDefinition的实例负责保存对象的所有必要信息,包括其对应的对象的class类型、是否是抽象类、构造方法参数、生命周期、作用域以及其他属性等

BeanDefinitionRegistry:BeanDefinition注册中心,在容器加载配置文件时,将Bean元数据配置解析为对应的BeanDefinition注册到BeanDefinitionRegistry 统一管理,DefaultListableBeanFactory实现了BeanFacory和BeanDefinitionRegistry,所以一般来说应用中的容器既可以作为IOC容器又实现了BeanDefinition注册管理功能

Scope:自定义bean作用域接口,spring基于该接口提供了与web整合的request、session的bean作用域,默认的singleton和prototype是硬编码到代码中的

FactoryBean:工厂对象接口,当bean的依赖注入为实现FactoryBean的实例时,被注入的就不是工厂对象本身,而是由工厂的生产方法getObject()返回的对象实例,isSingleton()方法返回结果用于表明,工厂方法( getObject())所“生产”的对象是否要以singleton形式存在于容器中。如果以singleton形式存在,则返回true, 否则返回false

BeanFactoryPostProcessor:容器启动阶段扩展点,通常使用该机制允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做相应的修改。spring提供的常用实现类:
1. PropertyPlaceholderConfigurer加载外部prop配置文件,已占位符的方式替换BeanDefinition中bean的属性值。
2. CustomEditorConfigurer辅助性地将后期会用到的信息注册到容器,对BeanDefinition没有做任何变动,只是管理了一系列的类型转换器,以便bean初始化阶段完成这种由字符串到具体对象的转换

InstantiationStrategy:bean实例化策略接口,Spring提供的实现类:
1. SimpleInstantiationStrategy:反射方式实例化
2. CglibSubclassingInstantiationStrategy:cglib代理方式实例化(容器对bean的默认实例化方式)

BeanWrapper:其作用是对某个bean进行“包裹”,然后对这个“包裹”的bean进行操作,比如设置或者获取bean的相应属性值
使用BeanWrapper对bean实例操作很方便,可以免去直接使用Java反射API( Java Reflection API)操作对象实例的烦琐。

Object provider = Class.forName("package.name.FXNewsProvider").newInstance(); 
Object listener = Class.forName("package.name.DowJonesNewsListener").newInstance();
Object persister = Class.forName("package.name.DowJonesNewsPersister").newInstance();
BeanWrapper newsProvider = new BeanWrapperImpl(provider); 
newsProvider.setPropertyValue("newsListener", listener);
newsProvider.setPropertyValue("newPersistener", persister);

assertTrue(newsProvider.getWrappedInstance() instanceof FXNewsProvider);
assertSame(provider, newsProvider.getWrappedInstance());
assertSame(listener, newsProvider.getPropertyValue("newsListener"));
assertSame(persister, newsProvider.getPropertyValue("newPersistener"));

各色的Aware接口:BeanNameAware,BeanClassLoaderAware,BeanFactoryAware,如果Bean实现以上接口,容器将会调用接口方法,注入相印的对象实例

        if (bean instanceof Aware) {
            if (bean instanceof BeanNameAware) {
                ((BeanNameAware) bean).setBeanName(beanName);
            }
            if (bean instanceof BeanClassLoaderAware) {
                ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
            }
            if (bean instanceof BeanFactoryAware) {
                ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
            }
         }

以上只是针对BeanFactory类型的容器而言

ApplicationContext类型的容器,也存在几个Aware相关接口,不过实现方式是通过BeanPostProcessor的实现类ApplicationContextAwareProcessor:

    private void invokeAwareInterfaces(Object bean) {
        if (bean instanceof Aware) {
            if (bean instanceof EnvironmentAware) {
                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
            }
            if (bean instanceof EmbeddedValueResolverAware) {
                ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);
            }
            if (bean instanceof ResourceLoaderAware) {
                ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
            }
            if (bean instanceof ApplicationEventPublisherAware) {
                ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);
            }
            if (bean instanceof MessageSourceAware) {
                ((MessageSourceAware) bean).setMessageSource(this.applicationContext);
            }
            if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
            }
        }
    }

BeanPostProcessor:插手bean的初始化。
主要提供两个方法干预bean:
1. postProcessBeforeInitialization 初始化前操作
2. postProcessAfterInitialization 初始化后操作
主要的使用场景为:处理标记接口,当bean实现某个标记接口时,可以通过对应的BeanPostProcessor对其做特殊处理

AutowiredAnnotationBeanPostProcessor:主要功能是支持注解注入
@Autowired 按类型,@Qualifier 按名称
CommonAnnotationBeanPostProcessor :
JSR250 标注依赖注入关系:@Resource,按名称注入,默认名称为标注属性的属性名,如果按名成无法获取依赖关系,则默认回退至按类型注入,通过设置属性fallbackToDefaultTypeMatch=false,可以关闭这个回退操作

在xml配置文件中 讲以上两个BeanPostProcessor注册到容器,并且PersistenceAnnotationBeanPostProcessor和RequiredAnnotationBeanPostProcessor也注册进了容器中

特殊的BeanPostProcessor—-InstantiationAwareBeanPostProcessor
该接口多了一个方法:

    default PropertyValues postProcessPropertyValues(
            PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {

        return pvs;
    }

作用是在对象的实例化过程中导致某种类似于电路“短路”的效果:
容器会首先检查容器中是否注册有InstantiationAwareBeanPostProcessor类型的BeanPostProcessor。如果有,首先使用相应的InstantiationAwareBeanPostProcessor来构造对象实例。构造成功后直接返回构造完成的对象实例,而不会按照“正规的流程”继续执行。这就是它可能造成“短路”的原因

classpath-scanning:当扫描到某个类标注了相应的注解之后,就会提取该类的相关信息,构建对应的BeanDefinition,然后把构建完的BeanDefinition注册到容器通过配置扫描的basePath,指定多个以逗号分隔的扫描路径
标注@Component、@Repository、 @Service和@Controller的类将会被提取并构建对应的BeanDefinition
同时将AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor一并注册到了容器中

Resource:spring对资源提供的一个统一抽象接口,作为对资源的抽象和访问
ResourceLoader:spring对资源定位提供的统一抽象接口,作为统一资源定位器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值