English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

注入DependencySpring

Inyección de dependencias usando método de fábrica en Spring

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();
}
}

factory-método tipo

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>

tipo1

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

tipo2

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

tipo3

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