2.16 Spring Framework 5.x 之BeanFactory

1.16 BeanFactory

该BeanFactoryAPI提供了春天的IoC功能的基本依据。其特定合同主要用于与Spring的其他部分和相关的第三方框架集成,其DefaultListableBeanFactory实现是更高级别GenericApplicationContext容器中的关键委托。

BeanFactory和相关接口(例如BeanFactoryAware,InitializingBean, DisposableBean)对于其他框架组件的重要结合点。通过不需要任何注释或甚至反射,它们允许容器与其组件之间的非常有效的交互。应用程序级bean可以使用相同的回调接口,但通常更喜欢通过注释或通过编程配置进行声明性依赖注入。

请注意,核心BeanFactoryAPI级别及其DefaultListableBeanFactory 实现不会对配置格式或要使用的任何组件注释做出假设。所有这些风格都通过扩展(例如XmlBeanDefinitionReader和AutowiredAnnotationBeanPostProcessor)来实现,并BeanDefinition作为核心元数据表示在共享对象上运行。这是使Spring的容器如此灵活和可扩展的本质。

1.16.1 BeanFactory还是ApplicationContext?

本节介绍之间的差异BeanFactory和 ApplicationContext容器级别和引导的意义。

您应该使用a,ApplicationContext除非您有充分的理由不这样做, GenericApplicationContext并将其子类AnnotationConfigApplicationContext 作为自定义引导的常见实现。这些是Spring用于所有常见目的的核心容器的主要入口点:加载配置文件,触发类路径扫描,以编程方式注册bean定义和带注释的类,以及(从5.0开始)注册功能bean定义。

因为a ApplicationContext包含a的所有功能BeanFactory,所以BeanFactory除了需要完全控制bean处理的场景之外,通常建议使用它。在一个ApplicationContext(例如 GenericApplicationContext实现)中,按照约定(即通过bean名称或bean类型 - 特别是后处理器)检测到几种bean,而plain DefaultListableBeanFactory对任何特殊bean都是不可知的。

对于许多扩展容器功能,例如注释处理和AOP代理,BeanPostProcessor扩展点是必不可少的。如果仅使用普通DefaultListableBeanFactory处理器,则默认情况下不会检测到并激活此类后处理器。这种情况可能令人困惑,因为您的bean配置实际上没有任何问题。相反,在这种情况下,容器需要通过其他设置完全自举。

下表列出了提供的功能BeanFactory和 ApplicationContext接口和实现。
表9.特征矩阵

特征 BeanFactory ApplicationContext
Bean实例化/wiring
集成的生命周期管理 没有
自动BeanPostProcessor注册 没有
自动BeanFactoryPostProcessor注册 没有
方便MessageSource访问(内化) 没有
内置ApplicationEvent发布机制 没有

要使用a显式注册bean后处理器DefaultListableBeanFactory,您需要以编程方式调用addBeanPostProcessor,如以下示例所示:

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
// populate the factory with bean definitions

// now register any needed BeanPostProcessor instances
factory.addBeanPostProcessor(new AutowiredAnnotationBeanPostProcessor());
factory.addBeanPostProcessor(new MyBeanPostProcessor());

// now start using the factory

要应用于BeanFactoryPostProcessorplain DefaultListableBeanFactory,需要调用其postProcessBeanFactory方法,如以下示例所示:

DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
reader.loadBeanDefinitions(new FileSystemResource("beans.xml"));

// bring in some property values from a Properties file
PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
cfg.setLocation(new FileSystemResource("jdbc.properties"));

// now actually do the replacement
cfg.postProcessBeanFactory(factory);

在这两种情况下,显式注册步骤都不方便,这就是为什么各种ApplicationContext变体优于DefaultListableBeanFactorySpring支持的应用程序中的普通模式 ,特别是在典型企业设置中依赖于BeanFactoryPostProcessor和BeanPostProcessor扩展容器功能的实例时。

一个AnnotationConfigApplicationContext注册后处理器具有所有通用注释,并且可以通过配置注释在封面下引入额外的处理器,例如@EnableTransactionManagement。在Spring的基于注释的配置模型的抽象级别,bean后处理器的概念变成仅仅是内部容器细节。

猜你喜欢

转载自blog.csdn.net/hadues/article/details/86487916