English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
El framework Spring proporciona la conveniencia de inyectar beans usando el método de fábrica. Para esto, podemos usar dos atributos del elemento bean.
factory-method: representa el método de fábrica que se llama para inyectar el bean. factory-bean: representa la referencia al bean que llama al método de fábrica. Si el método de fábrica no es estático, se utiliza.
Se llama a un método que devuelve la instancia de la clase factory-method.
public class A { public static A getA(){//método de fábrica return new A(); } }
puede haber tres tipos de factory-method:
1)devuelto método de fábrica estático propiola instancia de la clase. Se utiliza para el patrón de diseño singleton.
<bean id="a" class="com.w3codebox.A" fábrica-method="getA"></bean>
2)un método de fábrica estáticoque devuelve otrouna instancia de la clase. La instancia utilizada es desconocida y se decide en tiempo de ejecución.
<bean id="b" class="com.w3codebox.A" fábrica-method="getB"></bean>
3)un fábrica no estáticamétodo, que devuelve otrouna instancia de la clase. La instancia utilizada es desconocida y se decide en tiempo de ejecución.
<bean id="a" class="com.w3codebox.A"></bean> <bean id="b" class="com.w3codebox.A" fábrica-method="getB" fábrica-bean="a"></bean>
Vamos a ver un código simple para inyectar dependencias usando el método de fábrica estático.
<bean id="a" class="com.w3codebox.A" fábrica-method="getA"></bean>
Vamos a ver un ejemplo completo para inyectar dependencias usando el método de fábrica en Spring. Para crear este ejemplo, creamos3个文件。
A.java applicationContext.xml Test.java
A.java
Esta clase es un singleton.
paquete com.w3codebox; public class A { private static final A obj = new A(); private A(){System.out.println("constructor privado");} public static A getA(){ System.out.println("método de fábrica "); return obj; } public void msg(){ System.out.println("hello user"); } }
applicationContext.xml
<?xml version="1.0" codificación="UTF-8"?> <beans xmlns="http://www.springframework.org/esquema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancia" xmlns:p="http://www.springframework.org/esquema/p" xsi:schemaLocation="http://www.springframework.org/esquema/beans http://www.springframework.org/esquema/beans/spring-beans-3.0.xsd"> <bean id="a" class="com.w3codebox.A" fábrica-method="getA"></bean> </beans>
Test.java
Esta clase obtiene el Bean de applicationContext.xml y llama al método msg.
package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); A a = (A) context.getBean("a"); a.msg(); } }
输出:
constructor privado método de fábrica hola usuario
Veamos un código simple de inyección de dependencias a través de un método de fábrica estático, que devuelve una instancia de otra clase.
Para crear en este ejemplo, creamos6个文件。
Printable.java A.java B.java PrintableFactory.java applicationContext.xml Test.java
Printable.java
paquete com.w3codebox; public interface Printable { void print(); }
A.java
paquete com.w3codebox; public class A implements Printable{ @Override public void print() { System.out.println("hello a"); } }
B.java
paquete com.w3codebox; public class B implements Printable{ @Override public void print() { System.out.println("hello b"); } }
PrintableFactory.java
paquete com.w3codebox; public class PrintableFactory { public static Printable getPrintable(){ //return new B(); return new A();//devuelve cualquier instancia, A o B } }
applicationContext.xml
<?xml version="1.0" codificación="UTF-8"?> <beans xmlns="http://www.springframework.org/esquema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancia" xmlns:p="http://www.springframework.org/esquema/p" xsi:schemaLocation="http://www.springframework.org/esquema/beans http://www.springframework.org/esquema/beans/spring-beans-3.0.xsd"> <bean id="p" class="com.w3codebox.PrintableFactory" factory-method="getPrintable"></bean> </beans>
Test.java
Este clase obtiene el Bean desde el archivo applicationContext.xml y llama al método print().
package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); Printable p = (Printable) context.getBean("p"); p.print(); } }
输出:
hello a
Veamos un ejemplo de inyección de dependencias a través de un método de fábrica no estático, que devuelve una instancia de otra clase.
Para crear este ejemplo, ya hemos creado6个文件。
Printable.java A.java B.java PrintableFactory.java applicationContext.xml Test.java
所有文件都与以前的文件相同,您只需更改两个文件: PrintableFactory和applicationContext.xml。
PrintableFactory.java
paquete com.w3codebox; public class PrintableFactory { //Método fábrica no estático public Printable getPrintable(){ return new A();//Cualquier instancia devolver, A o B } }
applicationContext.xml
<?xml version="1.0" codificación="UTF-8"?> <beans xmlns="http://www.springframework.org/esquema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instancia" xmlns:p="http://www.springframework.org/esquema/p" xsi:schemaLocation="http://www.springframework.org/esquema/beans http://www.springframework.org/esquema/beans/spring-beans-3.0.xsd"> <bean id="pfactory" class="com.w3codebox.PrintableFactory"></bean> <bean id="p" class="com.w3codebox.PrintableFactory" factory-method="getPrintable" factory-bean="pfactory"></bean> </beans>
输出:
hello a