English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring фреймворк предоставляет удобства для инъекции bean с использованием фабричных методов. Для этого мы можем использовать два属性 элемента bean.
factory-method: Представляет фабричный метод, который будет вызываться для инъекции bean. factory-bean: Представляет ссылку на bean, который будет вызывать фабричный метод. Если фабричный метод не статический, то используется он.
Метод, который возвращает экземпляр класса, называется factory-method.
public class A { public static A getA(){//factory method return new A(); } }
Может быть трех типов factory-method:
1) Возвращаемый статический фабричный метод своегоПример класса. Используется для паттерна 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>
Давайте посмотрим на простую кодовую строку для инъекции зависимостей с помощью статического метода фабрики.
<bean id="a" class="com.w3codebox.A" factory-method="getA"></bean>
Давайте посмотрим на полный пример использования метода фабрики для инъекции зависимостей в Spring. Для создания этого примера мы создали 3 файла.
A.java applicationContext.xml Test.java
A.java
Этот класс является singleton.
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
Этот класс получает Bean из файла applicationContext.xml и вызывает метод 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(); } }
Вывод:
private constructor factory method hello user
Давайте посмотрим на простую кодовую строку для инъекции зависимостей через статический метод фабрики, который возвращает экземпляр другого класса.
В этом примере мы создали 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
Этот класс��取 Bean из файла applicationContext.xml и вызывает метод 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
Давайте посмотрим на пример инъекции зависимостей через неявный фабричный метод, который возвращает экземпляр другого класса.
Для создания этого примера мы создали 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();//Вернуть любую инстанцию, 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="pfactory" class="com.w3codebox.PrintableFactory"> <bean id="p" class="com.w3codebox.PrintableFactory" factory-method="getPrintable"> factory-bean="pfactory"></bean> </beans>
Вывод:
hello a