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

SpringDependency-Injektion

Abhängigkeitsinjektion mit dem Fabrikmethod in Spring verwenden

Der Spring-Framework bietet die Bequemlichkeit, Beans mit dem Fabrikmethod zu injizieren. Dafür können wir die beiden Attribute des bean-Elements verwenden.

factory-method: ) der Fabrikmethod ist, der aufgerufen wird, um das Bean zu injizieren. factory-bean: ) die Referenz des Beans, das den Fabrikmethod aufruft, darstellt. Wenn der Fabrikmethod nicht statisch ist, wird er verwendet.

Ein Verfahren, das die Instanz der Klasse zurückgibt, wird als factory-method).

public class A {
public static A getA() {//Fabrikmethod
    return new A();
}
}

factory-method-Typ

kann drei Arten von factory-method:

1) zurückgegebenen statische Fabrikmethod eigene) eine Instanz der Klasse. Wird für das Singleton-Designmuster verwendet.

<bean id="a" class="com.w3codebox.A" Fabrik-method="getA"></bean>

2) eine statische Fabrikmethodwird zurückgegeben ein weiteresEin Beispiel für eine Instanz der Klasse. Die verwendete Instanz ist unbekannt und wird zur Laufzeit entschieden.

<bean id="b" class="com.w3codebox.A" Fabrik-method="getB"></bean>

3) eine nicht-statische FabrikMethode, die ein weiteresEin Beispiel für eine Instanz der Klasse. Die verwendete Instanz ist unbekannt und wird zur Laufzeit entschieden.

<bean id="a" class="com.w3codebox.A"></bean>
<bean id="b" class="com.w3codebox.A" Fabrik-method="getB" factory-bean="a"></bean>

类型1

Lassen Sie uns ein einfaches Beispiel sehen, um Abhängigkeiten mit dem statischen Fabrikmethod Injection zu verwenden.

<bean id="a" class="com.w3codebox.A" Fabrik-method="getA"></bean>

Lassen Sie uns einen vollständigen Beispiel sehen, um Abhängigkeiten mit dem Fabrikmethod Injection in Spring zu verwenden. Um dieses Beispiel zu erstellen, haben wir3个文件。

A.java applicationContext.xml Test.java

A.java

Diese Klasse ist ein Singleton.

package com.w3codebox;
public class A {
private static final A obj = new A();
private A() {System.out.println("privater Konstruktor");}
public static A getA() {
    System.out.println("Fabrikmethod ");
    return obj;
}
public void msg() {
    System.out.println("hello user");
}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="a" class="com.w3codebox.A" Fabrik-method="getA"></bean>
</beans>

Test.java

Diese Klasse holt das Bean aus der Datei applicationContext.xml und ruft die msg-Methode auf.

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

Ausgabe:

privater Konstruktor
Fabrikmethod
hello user

类型2

让我们看一下通过静态工厂方法注入依赖关系的简单代码,该方法返回另一个类的实例。

为了创建在此示例中,我们创建了6个文件。

Printable.java A.java B.java PrintableFactory.java applicationContext.xml Test.java

Printable.java

package com.w3codebox;
public interface Printable {
void print();
}

A.java

package com.w3codebox;
public class A implements Printable{
    @Override
    public void print() {
        System.out.println("hello a");
    }
}

B.java

package com.w3codebox;
public class B implements Printable{
    @Override
    public void print() {
        System.out.println("hello b");
    }
}

PrintableFactory.java

package com.w3codebox;
public class PrintableFactory {
    public static Printable getPrintable(){
        //return new B();
              return new A();//返回任意一个实例,A或B
    }
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="p" class="com.w3codebox.PrintableFactory" factory-method="getPrintable"></bean>
</beans>

Test.java

此类从applicationContext.xml文件获取Bean并调用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();
}
}

Ausgabe:

hello a

类型3

让我们看一下通过非静态工厂方法注入依赖关系的示例,该方法返回另一个类的实例。

为了创建这个示例,我们已经创建了6个文件。

Printable.java A.java B.java PrintableFactory.java applicationContext.xml Test.java

所有文件都与以前的文件相同,您只需更改两个文件: PrintableFactory和applicationContext.xml。

PrintableFactory.java

package com.w3codebox;
public class PrintableFactory {
    //Nicht statische Fabrikmethode
    public Printable getPrintable(){
        return new A();//Rückgabe jeder Instanz, A oder B
    }
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/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>

Ausgabe:

hello a