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

Iniezione di dipendenze di Spring

Iniezione di dipendenze con il metodo factory in Spring

Il framework Spring fornisce la convenienza di iniettare bean utilizzando il metodo factory. Per questo, possiamo utilizzare due attributi dell'elemento bean.

factory-method: Rappresenta il metodo factory che verrà chiamato per iniettare il bean. factory-bean: Rappresenta il riferimento al bean che chiamerà il metodo factory. Se il metodo factory non è statico, utilizzalo.

Un metodo che restituisce un'istanza di classe è chiamato factory-method.

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

tipologia di factory-method

ci possono essere tre tipi di factory-method:

1) Il valore restituito 静态工厂方法 proprioEsempio di istanza di classe. Utilizzato per il modello di progettazione singleton.

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

2)一种 静态工厂方法,它返回 另一个类的实例。所使用的实例未知,并在运行时决定。

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

3)一种 非静态工厂方法,该方法返回 另一个类的实例。所使用的实例未知,并在运行时决定。

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

类型1

让我们看一下用静态工厂方法注入依赖项的简单代码。

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

让我们看一下完整的示例,以在Spring使用工厂方法注入依赖项。为了创建此示例,我们创建了3个文件。

A.java applicationContext.xml Test.java

A.java

此类是单例类。

package com.w3codebox;
public class A {
private static final A obj=new A();
private A(){System.out.println("private constructor");}
public static A getA(){
    System.out.println("factory method ");
    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" factory-method="getA"></bean>
</beans>

Test.java

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

Output:

private constructor
factory method
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();
}
}

Output:

hello a

类型3

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

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

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

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

PrintableFactory.java

package com.w3codebox;
public class PrintableFactory {
    //非静态工厂法
    public Printable getPrintable() {
        return new A();//Restituisce qualsiasi istanza, A o 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 id="p" class="com.w3codebox.PrintableFactory" factory-method="getPrintable"> 
factory-bean="pfactory"></bean>
</beans>

Output:

hello a