English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
A framework Spring oferece conveniência para injetar bean usando o método de fábrica. Para isso, podemos usar os dois atributos do elemento bean.
factory-method: representa o método de fábrica que será chamado para injetar o bean. factory-bean: representa a referência do bean que será chamado pelo método de fábrica. Se o método de fábrica não for estático, use-o.
Um método que retorna a instância da classe é chamado factory-method.
public class A { public static A getA(){//método de fábrica return new A(); } }
pode haver três tipos de factory-method:
1) retornado método de fábrica estático seuinstância da classe. Usado para o padrão de design singleton.
<bean id="a" class="com.w3codebox.A" fábrica-method="getA"></bean>
2) um método de fábrica estáticoque retorna outroinstância da classe. A instância usada é desconhecida e decidida no tempo de execução.
<bean id="b" class="com.w3codebox.A" fábrica-method="getB"></bean>
3) um fábrica não estáticamétodo, que retorna outroinstância da classe. A instância usada é desconhecida e decidida no tempo de execução.
<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 ver um código simples para injetar dependências usando o método de fábrica estático.
<bean id="a" class="com.w3codebox.A" fábrica-method="getA"></bean>
Vamos ver um exemplo completo para injetar dependências usando o método de fábrica no Spring. Para criar este exemplo, criamos3个文件。
A.java applicationContext.xml Test.java
A.java
Esta classe é um singleton.
pacote com.w3codebox; public class A { private static final A obj = new A(); private A(){System.out.println("construtor 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" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/esquema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instância" 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
Este classe obtém o Bean do arquivo applicationContext.xml e chama o 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(); } }
Saída:
construtor privado método de fábrica hello user
让我们看一下通过静态工厂方法注入依赖关系的简单代码,该方法返回另一个类的实例。
为了创建在此示例中,我们创建了6个文件。
Printable.java A.java B.java PrintableFactory.java applicationContext.xml Test.java
Printable.java
pacote com.w3codebox; public interface Printable { void print(); }
A.java
pacote com.w3codebox; public class A implements Printable{ @Override public void print() { System.out.println("hello a"); } }
B.java
pacote com.w3codebox; public class B implements Printable{ @Override public void print() { System.out.println("hello b"); } }
PrintableFactory.java
pacote 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/esquema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instância" 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
此类从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(); } }
Saída:
hello a
让我们看一下通过非静态工厂方法注入依赖关系的示例,该方法返回另一个类的实例。
为了创建这个示例,我们已经创建了6个文件。
Printable.java A.java B.java PrintableFactory.java applicationContext.xml Test.java
所有文件都与以前的文件相同,您只需更改两个文件: PrintableFactory和applicationContext.xml。
PrintableFactory.java
pacote com.w3codebox; public class PrintableFactory { //Método de fábrica não estático public Printable getPrintable(){ return new A();//Retornar qualquer instância, A ou B } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/esquema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instância" 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>
Saída:
hello a