Soy bastante nuevo en Spring Framework, he estado jugando con él y reuniendo algunas aplicaciones de muestra con el fin de evaluar Spring MVC para su uso en un próximo proyecto de la compañía. Hasta ahora, me gusta mucho lo que veo en Spring MVC, parece muy fácil de usar y lo alienta a escribir clases que sean muy fáciles de realizar en las pruebas unitarias.
Solo como ejercicio, estoy escribiendo un método principal para uno de mis proyectos de muestra / prueba. Una cosa que no tengo claro es las diferencias exactas entre BeanFactory
y ApplicationContext
- ¿cuál es apropiado usar en qué condiciones?
Entiendo que se ApplicationContext
extiende BeanFactory
, pero si solo estoy escribiendo un método principal simple, ¿necesito la funcionalidad adicional que ApplicationContext
proporciona? ¿Y exactamente qué tipo de funcionalidad adicional ApplicationContext
proporciona?
Además de responder "¿qué debo usar en un método main ()", ¿existen estándares o pautas en cuanto a qué implementación debo usar en tal escenario? ¿Debería escribirse mi método main () para que dependa de que la configuración de bean / aplicación esté en formato XML? ¿Es una suposición segura o estoy bloqueando al usuario en algo específico?
¿Y esta respuesta cambia en un entorno web? Si alguna de mis clases necesita estar al tanto de Spring, ¿es más probable que la necesiten ApplicationContext
?
Gracias por cualquier ayuda. Sé que muchas de estas preguntas probablemente se respondan en el manual de referencia, pero me resulta difícil encontrar un desglose claro de estas dos interfaces y las ventajas y desventajas de cada una sin leer el manual con un peine de dientes finos.
BeanFactory
podemos pasar parámetros de constructor dinámicamente pero conApplicationContext
no podemos hacer eso.FileSystemXmlApplicationContext
Frijoles cargados a través del camino completo.ClassPathXmlApplicationContext
Frijoles cargados a través del CLASSPATHXMLWebApplicationContext
yAnnotationConfigWebApplicationContext
beans cargados a través del contexto de la aplicación web.AnnotationConfigApplicationContext
Cargando Spring beans desde la configuración basada en Anotación.ejemplo:
ApplicationContext
es el contenedor inicializado por aContextLoaderListener
oContextLoaderServlet
definido en aweb.xml
yContextLoaderPlugin
definido enstruts-config.xml
.Nota :
XmlBeanFactory
está en desuso a partir de Spring 3.1 a favor deDefaultListableBeanFactory
yXmlBeanDefinitionReader
.fuente
Para mí, la diferencia principal para elegir
BeanFactory
másApplicationContext
parece ser queApplicationContext
se pre-instantiate todos los granos. De los documentos de primavera :Dado esto, inicialmente elegí
BeanFactory
usar en pruebas de integración / rendimiento ya que no quería cargar toda la aplicación para probar beans aislados. Sin embargo, y alguien me corrige si me equivoco,BeanFactory
no admite laclasspath
configuración XML. Entonces,BeanFactory
yApplicationContext
cada uno proporciona una característica crucial que quería, pero ninguno de los dos.Por lo que puedo decir, la nota en la documentación sobre cómo anular el comportamiento predeterminado de instanciación tiene lugar en la configuración, y es por bean, por lo que no puedo simplemente establecer el atributo "lazy-init" en el archivo XML o estoy atascado manteniendo una versión para prueba y otra para implementación.
Lo que terminé haciendo fue extender
ClassPathXmlApplicationContext
para cargar frijoles perezosamente para usar en pruebas como esta:fuente
BeanFactory doesn't support classpath XML configuration.
Creo que sí: stackoverflow.com/questions/5231371/…Para agregar a lo que respondió Miguel Ping, aquí hay otra sección de la documentación que también responde a esto:
(publicar esto para cualquier futuro principiante de primavera que pueda leer esta pregunta)
fuente
ApplicationContext
es la forma más preferida queBeanFactory
En las nuevas versiones de Spring
BeanFactory
se reemplaza conApplicationContext
. Pero todavíaBeanFactory
existe para la compatibilidad con versiones anteriores.ApplicationContext extends BeanFactory
y tiene los siguientes beneficiosfuente
ApplicationContext: carga los beans spring configurados en el archivo de configuración spring, y administra el ciclo de vida del bean spring como y CUANDO EL CONTENEDOR COMIENZA. No esperará hasta que se llame a getBean ("springbeanref") .
BeanFactory Carga spring beans configurados en el archivo de configuración de spring, gestiona el ciclo de vida del spring bean cuando llamamos a getBean ("springbeanref") . Así que cuando llamamos a getBean ("springbeanref") en el momento del inicio del ciclo de vida de spring bean .
fuente
Creo que es mejor usar siempre ApplicationContext, a menos que esté en un entorno móvil como ya dijo alguien más. Application Context tiene más funcionalidad y que debe de utilizar los Postprocesadores como RequiredAnnotationBeanPostProcessor, AutowiredAnnotationBeanPostProcessor y CommonAnnotationBeanPostProcessor, lo que ayudará a simplificar sus archivos de configuración de la primavera, y se puede utilizar anotaciones tales como @Required, @PostConstruct, @Resource, etc en sus granos .
Incluso si no usa todas las cosas que ofrece ApplicationContext, es mejor usarlas de todos modos, y luego si decide usar algunas cosas de recursos como mensajes o procesadores posteriores, o el otro esquema para agregar consejos transaccionales y tal, usted ya tendrá un ApplicationContext y no necesitará cambiar ningún código.
Si está escribiendo una aplicación independiente, cargue el ApplicationContext en su método principal, utilizando un ClassPathXmlApplicationContext, y obtenga el bean principal e invoque su ejecución () (o cualquier método) para iniciar su aplicación. Si está escribiendo una aplicación web, use ContextLoaderListener en web.xml para que cree el ApplicationContext y luego pueda obtenerlo del ServletContext, independientemente de si está utilizando JSP, JSF, JSTL, struts, Tapestry, etc. .
Además, recuerde que puede usar varios archivos de configuración de Spring y puede crear ApplicationContext enumerando todos los archivos en el constructor (o enumerándolos en el parámetro de contexto para ContextLoaderListener), o simplemente puede cargar un archivo de configuración principal que tiene declaraciones de importación. Puede importar un archivo de configuración de Spring a otro archivo de configuración de Spring utilizando <import resource = "otherfile.xml" />, que es muy útil cuando crea ProgramContext mediante el método principal y carga solo un archivo de configuración de Spring.
fuente
En su mayor parte, se prefiere ApplicationContext a menos que necesite guardar recursos, como en una aplicación móvil.
No estoy seguro de depender del formato XML, pero estoy bastante seguro de que las implementaciones más comunes de ApplicationContext son las XML como ClassPathXmlApplicationContext, XmlWebApplicationContext y FileSystemXmlApplicationContext. Esos son los únicos tres que he usado.
Si está desarrollando una aplicación web, es seguro decir que necesitará usar XmlWebApplicationContext.
Si desea que sus beans estén al tanto de Spring, puede hacer que implementen BeanFactoryAware y / o ApplicationContextAware para eso, de modo que pueda usar BeanFactory o ApplicationContext y elegir qué interfaz implementar.
fuente
ApplicationContext
incluye toda la funcionalidad de laBeanFactory
, generalmente se recomienda que se use con preferencia a laBeanFactory
, excepto en algunas situaciones limitadas como en unApplet
, donde el consumo de memoria podría ser crítico y algunos kilobytes adicionales podrían Hacer la diferencia. Sin embargo, para la mayoría de las aplicaciones y sistemas empresariales 'típicos', elApplicationContext
es lo que querrá usar.Las diferencias entre BeanFactory y ApplicationContext son las siguientes:
Usando BeanFactory:
Usando ApplicationContext:
fuente
BeanFactory y ApplicationContext son formas de obtener frijoles de su contenedor Spring IOC , pero aún hay alguna diferencia.
BeanFactory es el contenedor real que crea instancias, configura y gestiona varios beans. Estos beans normalmente colaboran entre sí y, por lo tanto, tienen dependencias entre ellos. Estas dependencias se reflejan en los datos de configuración utilizados por BeanFactory.
BeanFactory y ApplicationContext son interfaces Java y ApplicationContext extiende BeanFactory. Ambos son de configuración utilizando archivos de configuración XML. En resumen, BeanFactory proporciona funciones básicas de Inversión de control ( IoC ) e Inyección de dependencias ( DI ), mientras que ApplicationContext proporciona funciones avanzadas .
Un BeanFactory está representado por la interfaz " org.springframework.beans.factory " Donde BeanFactory, para el que hay múltiples implementaciones.
DIFERENCIA
BeanFactory instancia el bean cuando llamas al método getBean () mientras ApplicationContext instancia el bean Singleton cuando se inicia el contenedor, no espera a que se llame a getBean ().
BeanFactory no proporciona soporte para la internacionalización, pero ApplicationContext brinda.
Otra diferencia entre BeanFactory y ApplicationContext es la capacidad de publicar eventos en beans que están registrados como oyentes.
Una de las implementaciones populares de la interfaz BeanFactory es XMLBeanFactory, mientras que una de las implementaciones populares de la interfaz ApplicationContext es ClassPathXmlApplicationContext .
Si está utilizando el cableado automático y está utilizando BeanFactory , debe registrar AutoWiredBeanPostProcessor utilizando la API que puede configurar en XML si está utilizando ApplicationContext . En resumen, BeanFactory está bien para las pruebas y el uso que no es de producción, pero ApplicationContext es una implementación de contenedor más rica en características y debe ser favorecida sobre BeanFactory
BeanFactory por defecto su apoyo Lazy carga y Application Context por el apoyo defecto Aggresive carga.
fuente
Matriz de características de Bean Factory vs Contexto de aplicación procedente de documentos de primavera
Captura de pantalla de las características de BeanFacotry y ApplicationContext
fuente
a. Una diferencia entre la fábrica de beans y el contexto de la aplicación es que el anterior solo instancia el bean cuando llama al método getBean () mientras que ApplicationContext instancia el bean Singleton cuando se inicia el contenedor. No espera a que se llame a getBean.
si.
o
Puede usar uno o más archivos xml según los requisitos de su proyecto. Como estoy aquí usando dos archivos xml, es decir, uno para detalles de configuración para clases de servicio y otro para clases de dao. Aquí ClassPathXmlApplicationContext es hijo de ApplicationContext.
C. BeanFactory Container es un contenedor básico, solo puede crear objetos e inyectar dependencias. Pero no podemos adjuntar otros servicios como seguridad, transacciones, mensajería, etc. para proporcionar todos los servicios que tenemos que usar ApplicationContext Container.
re. BeanFactory no proporciona soporte para la internacionalización, es decir, i18n, pero ApplicationContext brinda soporte para ello.
mi. BeanFactory Container no admite la función de AutoScanning (Inyección de dependencias basada en anotaciones de soporte), pero ApplicationContext Container sí lo admite.
F. Beanfactory Container no creará un objeto bean hasta el momento de la solicitud. Significa que Beanfactory Container carga frijoles perezosamente. Mientras ApplicationContext Container crea objetos de bean Singleton en el momento de la carga solamente. Significa que hay una carga temprana.
gramo. Beanfactory Container admite solo dos ámbitos (singleton y prototipo) de los beans. Pero ApplicationContext Container admite todo el alcance de beans.
fuente
Básicamente, podemos crear objetos contenedor de resorte de dos maneras
ambas son las interfaces,
Usando clases de implementación podemos crear objetos para el contenedor Spring
llegando a las diferencias
BeanFactory:
No admite la inyección de dependencia basada en anotaciones.
No es compatible con I18N.
Por defecto es compatible con la carga diferida.
no permite configurar a múltiples archivos de configuración.
ej .: contexto BeanFactory = nuevo XmlBeanFactory (nuevo recurso ("applicationContext.xml"));
ApplicationContext
Inyección de dependencia basada en anotaciones de soporte.-@Autowired, @PreDestroy
Soporte I18N
Su soporte predeterminado es la carga agresiva.
Permite configurar múltiples archivos de configuración.
ej:
contexto de ApplicationContext = nuevo ClasspathXmlApplicationContext ("applicationContext.xml");
fuente
Consulte este documento de Spring Docs:
http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/beans.html#context-introduction-ctx-vs-beanfactory
5.15.1 BeanFactory o ApplicationContext?
Use un ApplicationContext a menos que tenga una buena razón para no hacerlo.
Debido a que ApplicationContext incluye toda la funcionalidad de BeanFactory, generalmente se recomienda sobre BeanFactory, excepto en algunas situaciones, como en un Applet, donde el consumo de memoria puede ser crítico y unos pocos kilobytes adicionales pueden marcar la diferencia. Sin embargo, para la mayoría de las aplicaciones y sistemas empresariales típicos, el ApplicationContext es lo que querrá usar. Spring 2.0 y posterior hace un uso intensivo del punto de extensión BeanPostProcessor (para efectuar proxy y así sucesivamente). Si usa solo un BeanFactory simple, una cantidad justa de soporte, como transacciones y AOP, no tendrá efecto, al menos no sin algunos pasos adicionales de su parte. Esta situación podría ser confusa porque en realidad no hay nada malo con la configuración.
fuente
ApplicationContext es un gran hermano de BeanFactory y esto sería todo lo que se proporciona BeanFactory además de muchas otras cosas.
Además de las capacidades estándar del ciclo de vida org.springframework.beans.factory.BeanFactory, las implementaciones de ApplicationContext detectan e invocan los beans ApplicationContextAware, así como los beans ResourceLoaderAware, ApplicationEventPublisherAware y MessageSourceAware.
fuente
En un escenario en tiempo real, la diferencia entre el contenedor Spring IOC Core (BeanFactory) y el contenedor Advanced J2EE (ApplicationContext) es la siguiente.
BeanFactory creará objetos para los beans (es decir, para las clases POJO) mencionados en el archivo spring.xml (
<bean></bean>
) solo cuando llame al método .getBean (), pero mientras que ApplicationContext crea los objetos para todos los beans (<bean></bean>
si su alcance no es mencionado explícitamente como "Prototipo") configurado en spring.xml al cargar el archivo spring.xml.BeanFactory: (Contenedor diferido porque crea los objetos para los beans solo cuando llama explícitamente desde la clase principal / usuario)
ApplicationContext: (Contenedor ansioso por crear los objetos de todos los beans singleton mientras se carga el archivo spring.xml)
Técnicamente, se recomienda usar ApplicationContext porque en aplicaciones en tiempo real, los objetos de bean se crearán mientras la aplicación se inicia en el servidor. Esto reduce el tiempo de respuesta para la solicitud del usuario ya que los objetos ya están disponibles para responder.
fuente
Creo que vale la pena mencionar que desde la primavera 3, si desea crear una fábrica, también puede usar la
@configuration
anotación combinada con la correcta@scope
Su fábrica debe ser visible por el contenedor Spring utilizando la
@ComponentScan
anotación o la configuración xmlArtículo de alcances de frijol de primavera del sitio baeldung
fuente
utilice BeanFactory para aplicaciones que no sean web porque solo admite ámbitos de bean Singleton y Prototype.
Si bien el contenedor ApplicationContext admite todos los ámbitos de bean, debería usarlo para aplicaciones web.
fuente
En resumen:
El contexto de la aplicación incluye toda la funcionalidad de la BeanFactory. Generalmente se recomienda usar el primero.
Hay algunas situaciones limitadas, como en una aplicación móvil, donde el consumo de memoria puede ser crítico.
En esos escenarios, puede ser justificable usar el BeanFactory más liviano . Sin embargo, en la mayoría de las aplicaciones empresariales, el ApplicationContext es lo que querrá usar.
Para más información, vea mi publicación de blog:
Diferencia entre BeanFactory y ApplicationContext en Spring: el blog de Java Spring desde lo básico
fuente
Necesito explicar el BeanFactory & ApplicationContext.
BeanFactory: BeanFactory es la interfaz raíz para acceder a SpringBean Container. Hay una vista básica del cliente de un contenedor de beans. Esa interfaz es implementada por la clase de objeto que contiene el número de definiciones de beans, y cada uno se identifica de forma única por el nombre de la cadena.
Dependiendo de la definición de Bean, la fábrica devolverá la instancia que puede ser la instancia del objeto contenido o una única instancia compartida. El tipo de instancia que se devolverá depende de la configuración de fábrica de beans.
Normalmente, Bean factory cargará toda la definición de todos los beans, que se almacenan en la fuente de configuración como XML ... etc.
BeanFactory es un contenedor más simple que proporciona el soporte básico para la inyección de dependencia
Contexto de aplicación aplicación El contexto de la aplicación es una interfaz central con la aplicación de primavera que proporciona la información de configuración a la aplicación. Implementa la interfaz de Bean Factory.
El contexto de la aplicación es un contenedor avanzado, su nivel avanzado adicional de funcionalidad específica de la empresa, como la capacidad de resolver el mensaje de texto del archivo de propiedades ... etc.
Un ApplicationContext proporciona:
Métodos de fábrica de frijoles para acceder a los componentes de la aplicación. Heredado de ListableBeanFactory. La capacidad de cargar recursos de archivos de manera genérica. Heredado de la interfaz ResourceLoader. La capacidad de publicar eventos para oyentes registrados. Heredado de la interfaz ApplicationEventPublisher. La capacidad de resolver mensajes, apoyando la internacionalización. Heredado de la interfaz MessageSource. Herencia de un contexto padre. Las definiciones en un contexto descendiente siempre tendrán prioridad. Esto significa, por ejemplo, que una aplicación web completa puede usar un contexto padre único, mientras que cada servlet tiene su propio contexto hijo que es independiente del de cualquier otro servlet. Además de las capacidades estándar del ciclo de vida de BeanFactory,
fuente