Meta definitiva
Permítanme describir brevemente el problema que este artículo quiere resolver: cómo no usar ya no usar la primavera para crear instancias de frijoles en primavera, sino transferir el proceso de creación de frijoles a los desarrolladores.
Pensamiento claro
Cómo crear una instancia de Bean:
1) a través del constructor (con o sin parámetros)
Método: <bean id=""/>
2) a través del método de fábrica estática
Método: <bean id="" factory-method="静态工厂方法"/>
NOTA: La instancia de la clase de fábrica no se crea
3) a través del método de fábrica de instancias (método no estático)
Forma:
<bean id="factory"/>
<bean id="" factory-bean="factory" factory-method="实例工厂方法"/>
Nota: se crea la instancia de clase de fábrica
Método práctico
Ejemplo 1 :
necesidad:
1 No quiero instanciar el bean cuando se cargue bean.xml, pero quiero separar el bean cargado.xml del objeto instanciado.
2 Implementar Singleton Bean
En las situaciones anteriores, los frijoles se pueden crear a través del método de fábrica.
De esta manera, cuando Bean.xml se cargue, el bean no se instanciará directamente, pero solo comenzará a ser realmente instanciado cuando se llama al método referido por el método de fábrica.
Implementación: cree un frijol singleton a través del método de fábrica de primavera
Primero cree un objeto singleton a través de una clase interna estática
paquete com.spring.test.factorymethod; public class Stage {public void interpret () {System.out.println ("Show Start ..."); } Etapa privada () {} private statics stagesingletonholder {static stage instance = new Stage (); } Public Static Stage getInstance () {return stagesingletonholder.instance; }}Especificar el método de carga en el archivo de configuración de Spring getInstance
<? xml versión = "1.0" encoding = "utf-8"?> <beans xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns = "http://www.springframework.org/schema/Beanss" " xsi: schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id = "thestage" factory-metod = "getinstance"> <</beay>
Obtenga instancia llamando a los frijoles en el contexto de la aplicación
paquete com.spring.test.factorymethod; import org.springframework.context.applicationContext; import org.springframework.context.support.classpathxmlapplicationContex ClasspathxmlaPplicationContext ("bean.xml"); Etapa etapa = ((etapa) ctx.getBean ("thestage")); //. GetInstance (); Stage.perform (); }}Resultados de la ejecución
24 de enero de 2015 6:38:18 PM org.springframework.context.support.abstractapplicationContext PrepareFreesh Información: Refrescante org.springframework.context.support.classpathxmlaPplicationContext@512dbd1a: startup date [sat 18:38:18 cst 2015; Raíz del contexto jerarquyjan 24 de jer, 2015 6:38:19 PM org.springframework.beans.factory.xml.xmlbeandefinitionReader LoadBeanDefinitions Información: Carga de definiciones de frijoles XML desde la clase Rath Resource [bean.xml] 24 de enero de 2015 6:38:19 PM org.springframework.beans.factory.support.defaultListableBeanFactory preinstantiatesingletons Información: preinstantantes singletons en org.springframework.beans.factory.support.defaultListableBeanfactory@2d1879ea: Definición de Beans [duke, Sonnet2999, PoeticListable, Thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage, thestage] Root of Factory La actuación de la jerarquía comienza ...
Introducción a la creación de métodos de fábrica Bean
1. Cree un frijol usando un método de fábrica estática
Al crear una instancia de Bean utilizando el método de fábrica Static, el atributo de clase también debe especificarse, pero en este momento el atributo de clase no es la clase de implementación que especifica la instancia de Bean, sino la clase de fábrica estática. Porque Spring necesita saber qué fábrica usar para crear la instancia de Bean. Además, debe usar el método de fábrica para especificar el nombre del método de fábrica estática. Spring llamará al método de fábrica estática (puede contener un conjunto de parámetros) para devolver una instancia de Bean. Una vez que se obtiene la instancia de Bean especificada, los pasos de procesamiento después de la primavera son exactamente los mismos que crear la instancia de Bean utilizando métodos ordinarios. Cabe señalar que al usar métodos de fábrica estática para crear frijoles, este método de fábrica debe ser estático. Este pasaje suena un poco mareado, sin decir mucho, agregue el código:
Primero defina una interfaz, y el método estático producirá una instancia de la interfaz:
Public Interface Animal {public void sayshello ();}Aquí hay dos clases de implementación de la interfaz:
clase pública Cat implementa animal {string privado msg; // El método establecido requerido durante la inyección de dependencia public void setmsg (string msg) {this.msg = msg; } @Override public void sayshello () {System.out.println (msg + ", meow ~ meow ~"); }} El perro de clase pública implementa animal {string privado msg; // El método establecido requerido durante la inyección de dependencia public void setmsg (string msg) {this.msg = msg; } @Override public void sayshello () {System.out.println (msg + ", fuerte ~ fuerte ~"); }}La fábrica AnimalFactory a continuación contiene un método estático de getanimal, que determinará qué objeto crear en función de los parámetros pasados. Este es un patrón de diseño de fábrica estática típica.
Public Clas AnimalFactory {Public Static Animal getanimal (tipo de cadena) {if ("cat" .equalsignorecase (type)) {return new Cat (); } else {return new dog (); }}}Si necesita especificar que Spring usa AnimalFactory para generar objetos animales, puede configurar lo siguiente en el archivo de configuración de Spring:
< value = "cat" /> < /bean> <!-Configure el método getAnimal de getanimalFactory para generar perro-> <bean id = "dog" fábrica-metro = "getAnimal"> <!-Configure los parámetros del método de fábrica estatic <propiedad name = "msg" value = "dog" /> < /bean>
De la configuración anterior, podemos ver que la clase y el método de fábrica de las dos configuraciones de frijoles de gato y perro son exactamente las mismas, porque ambas instancias se generan utilizando la misma clase de fábrica estática y el mismo método de fábrica estática. Es solo que los parámetros especificados para este método de fábrica estática son diferentes, use el elemento <constructor-arg /> para especificar parámetros para el método de fábrica estática.
El método del programa principal para obtener dos instancias de frijoles gato y perro permanece sin cambios. Solo necesita llamar a getBean () del contenedor de primavera:
Prueba de clase pública {public static void main (string args []) {applicationContext context = new classpathxmLapPlicationContext ("ApplicationContext.xml"); Animal a1 = context.getBean ("gato", animal.class); a1.sayhello (); Animal a2 = context.getBean ("perro", animal.class); a2.sayhello (); }}Resultado de salida:
<code> Cat, Meow ~ Meow ~ Dog, Strong ~ Strong ~ </code>
Al crear una instancia utilizando un método de fábrica estática, debe proporcionar la clase de fábrica y el método de fábrica estática que genera la instancia. Al crear una instancia a través de un método de fábrica estática, debe realizar los siguientes cambios en el archivo de configuración de Spring;
El atributo de clase no es la clase de implementación de la instancia de Bean, sino la clase de fábrica estática que genera la instancia de Bean
Use el método de fábrica para especificar un método de fábrica estática para producir una instancia de Bean
Si el método de fábrica estática requiere parámetros, use el elemento <constructor-arg /> para configurarlo
Cuando especificamos que Spring usa un método de fábrica estática para crear una instancia de Bean, Spring analizará primero el archivo de configuración y llamará al método de fábrica estática de la clase de fábrica estática a través de la reflexión basada en la información especificada por el archivo de configuración y usará el valor de retorno del método de fábrica estática como la instancia de Bean. En este proceso, Spring ya no es responsable de crear una instancia de Bean, y la instancia de Bean es proporcionada por el método de fábrica estática proporcionada por el usuario.
2. Cree un bean usando el método de fábrica de instancias
El método de fábrica de instancias es solo un poco diferente del método de fábrica estática: llamar al método de fábrica estática solo requiere usar la clase de fábrica, y llamar al método de fábrica de instancias debe usar la instancia de fábrica. Por lo tanto, solo hay una diferencia en la configuración de Spring: configure el método de fábrica estática para especificar la clase de fábrica Static y configure el método de fábrica de instancias para especificar la instancia de fábrica. El mismo ejemplo anterior cambia a AnimalFactory a:
Public Clas AnimalFactory {public animal getanimal (tipo de cadena) {// Aquí, la palabra clave estática solo se elimina si ("cat" .equalSignorecase (type)) {return new Cat (); } else {return new dog (); }}}El archivo de primavera se modifica a:
< value = "cat" /> < /bean> <bean id = "dog" fábrica-bean = "animalfactory" fábrica-metod = "getanimal"> <constructor-arg value = "dog" /> <propiedad name = "msg" value = "dog" /> </ bean>
La clase de prueba no necesita modificarse, los resultados de la salida son los mismos que anteriores.
En muchos casos, <bean id = "bean1" class = "..." /> se usa para definir un frijol. De esta manera, Spring llamará al constructor predeterminado sin parámetros para crear una instancia de Bean. Además, también puede usar Factory para crear instancias de frijoles para separar la creación y el uso de frijoles, y entregar el trabajo de creación de frijoles a la fábrica para completar.
Hay tres formas de configurar los frijoles de fábrica.
Interfaz abstracta:
interfaz pública imusicbox {public void play (); } 1. Obtenga ejemplos de frijoles para el método de fábrica estática
Categoría de fábrica:
public class musicboxFactory {public static imusicbox createMusicbox () {return new imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; }}Archivo de configuración:
<bean id = "musicbox" factory-method = "createMusicBox />
Clase de prueba:
public static void main (string [] args) {applicationContext ctx = new ClassPathXMLApPlicationContext ("Bean-Config.xml"); Imusicbox musicbox = (imusicbox) ctx.getBean ("musicbox"); musicbox.play (); }2. El método de instancia de fábrica obtiene la instancia de Bean
Categoría de fábrica:
public class MusicBoxFactory {public imusicbox createMUSicBox () {// sin modificación estática devolver nuevo imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; }}Archivo de configuración:
<bean id = "factorybean" /> <bean id = "musicbox" factory-bean = "factorybean" factory-method = "createMusicBox" />
El atributo "Factory-Bean" especifica el bean de fábrica, y el atributo "método de fábrica" especifica el método de fábrica para obtener la instancia de Bean.
Clase de prueba:
public static void main (string [] args) {applicationContext ctx = new ClassPathXMLApPlicationContext ("Bean-Config.xml"); Imusicbox musicbox = (imusicbox) ctx.getBean ("musicbox"); musicbox.play (); } 3. La clase de fábrica implementa org.springframework.beans.factory.facotrybean Interface
Categoría de fábrica:
importar org.springframework.beans.factory.factorybean; public class musicboxFactory2 implementa factoryBean {public object getObject () lanza la excepción {return new imusicbox () {public void play () {System.out.println ("Play Piano ..."); }}; } public class getObjectType () {return imusicbox.class; } public boolean issingleton () {return false; }}Archivo de configuración:
<bean id = "musicbox"/>
Clase de prueba:
public static void main (string [] args) {applicationContext ctx = new ClassPathXMLApPlicationContext ("Bean-Config.xml"); // no se agrega y devuelve el "producto" de la fábrica imusicbox musicbox = (imusicbox) ctx.getBean ("musicbox"); musicbox.play (); // Agregar y devolver el objeto de instancia de clase de fábrica obj = ctx.getBean ("& musicbox"); System.out.println (obj.getClass (). GetName ()); }Las clases que implementan la interfaz de fábrica no se considerarán los frijoles ordinarios, Spring los detectará automáticamente y llamará al método GetObject para obtener la instancia de Bean.
Resumir
Este es el final de la introducción a instancias de instancias de frijoles en los métodos de fábrica de primavera. Si tiene alguna deficiencia, puede dejar que un mensaje señale. ¡Gracias amigos por su apoyo para este sitio!