A diferença entre Spring BeanFactory e FactoryBean

Crie o hábito de escrever juntos! Este é o 4º dia da minha participação no "Nuggets Daily New Plan · April Update Challenge", clique para ver os detalhes do evento .

O falcão de tiro público está acima da torre alta e não há desvantagem em obtê-lo.

prefácio

SpringEm , IOCé um conceito muito importante, sua essência é a estrutura do mapa, container de armazenamento e informações do business bean. No entanto BeanFactory, FactoryBeana diferença entre e é um ponto de conhecimento muito importante.Neste artigo, o código-fonte será analisado e explicado.

diferença e conexão

BeanFactory

SpringEm , todos Beansão gerenciados por BeanFactory(ou seja, o contêiner IOC). BeanFactoryA forma básica do contêiner é definida e a interface básica e o ciclo de vida do contêiner IOC são especificados.Também há muitas classes de implementação para BeanFactory, como , ApplicationContexte interfaces que adicionam funções adicionais. O objeto precisa seguir a seguinte forma de ciclo de vida, e a produção é realizada através do mecanismo de reflexão.DefaultListableBeanFactoryXmlBeanFactoryBeanFactoryBeanBean

Em inglês, Awaresignifica consciência. Você pode ver que BeanFactoryo processo do ciclo de vida inclui muitas Awareinterfaces:

Implementação do BeanFactory

A seguir estão os seguintes métodos relacionados ao ciclo de vida da BeanFactoryinterface , que são amplamente utilizados no desenvolvimento de projetos, ApplicationContextAware, eInitializingBean .DisposableBean

BeanNameAware.setBeanName 用于设置 Bean 的名称
BeanClassLoaderAware.setBeanClassLoader 设置类加载器
BeanFactoryAware.setBeanFactory 设置 bean 工厂
ResourceLoaderAware.setResourceLoader 设置资源加载器
ApplicationEventPublisherAware.setApplicationEventPublisher 设置事件发布器
MessageSourceAware.setMessageSource 设置信息资源
ApplicationContextAware.setApplicationContext 设置应用上下文
ServletContextAware.setServletContext 设置 Servlet 上下文
BeanPostProcessor.postProcessBeforeInitialization 前置处理器
InitializingBean.afterPropertiesSet Bean 初始化操作
RootBeanDefinition.getInitMethodName 设置Bean 的初始化方法名称
BeanPostProcessor.postProcessAfterInitialization 后置处理器
DisposableBean.destroy 设置 Bean 销毁
RootBeanDefinition.getDestroyMethodName 获取 Bean 销毁的方法
复制代码

Por padrão, se você chamar diretamente o método getBean, ele retornará um objeto criado em fábrica.Se você deseja obter o próprio Bean, é necessário adicionar o símbolo & como prefixo para processamento.

FactoryBean

No entanto, em alguns casos específicos, a operação de Beaninstanciação será muito complicada, e um grande número de propriedades precisa ser configurado de acordo com seus requisitos. Neste momento Bean, a flexibilidade de configuraçãoFactoryBean precisa construir Beanobjetos sem seguir Beano fluxo do ciclo de vida . SpringEle fornece muitas implementações FactoryBeanpor , que ocultam uma série de detalhes complexos de instanciação e trazem conveniência para aplicativos de camada superior. Desde que o Srping 3.0 FactoryBeancomeçou a dar suporte aos genéricos, ou seja, a declaração da interface é alterada para FactoryBean<T>a forma de . FactoryBeanNa aplicação de , SqlSessionFactoryBeané uma boa prática. No processo de operação do banco de dados, ele fornece SqlSessionuma Factory.

Resumir

BeanFactoryFornece uma especificação de contêiner Spring IOC que pode produzir e gerenciar uma interface de fábrica para beans. Mas FactoryBeané uma forma especial de criação do bean, que não precisa seguir a especificação do container IOC, mas uma extensão do bean. Para criação e uso de objetos de bean complexos, ele pode encapsular os detalhes de criação do objeto.

Acho que você gosta

Origin juejin.im/post/7082620724443086855
Recomendado
Clasificación