1

我正在使用 Spring 开发一个 Web 应用程序。

我有一个通用的抽象类和它的许多实现。

现在,在控制器中,根据某些参数,我需要不同的实现。

这可以通过工厂模式轻松实现。

例如:

abstract class Animal{
    public abstract void run(){
        }
}

class Dog extends Animal{   
...
}
Class Cat extends Animal{
...
}

现在使用工厂模式,我可以使用工厂方法创建工厂类,该工厂方法基于某些参数创建动物。但我不想自己创建实例

我需要相同的功能,但我希望 Spring 管理一切。因为不同的实现有它们的依赖关系,我希望它们被 Spring 注入。

处理这种情况的最佳方法是什么?

4

3 回答 3

1
@Component
public class AnimalFactory {
    @Autowired
    private Dog dog;

    @Autowired
    private Cat cat;

    public Animal create(String kind) {
        if (king.equals("dog") {
            return dog;
        }
        else {
            return cat;
        }
    }
}

@Component
public class Cat extends Animal {
    ...
}

@Component
public class Dog extends Animal {
    ...
}

@Component
private class Client {
    @Autowired
    private AnimalFactory factory;

    public void foo() {
        Animal animal = factory.create("dog"); 
        animal.run();
    }
}
于 2013-09-13T08:58:53.623 回答
1

将要创建的 bean 配置为原型 bean。接下来创建一个工厂,它基本上知道根据输入从应用程序上下文中检索哪个 bean(因此,您基本上让 spring 完成繁重的工作,而不是创建它们)。

可以@Component结合@Scope("prototype")或使用 XML 配置来定义组件。

abstract class Animal{
    public abstract void run(){}
}

@Component
@Scope("prototype")
class Dog extends Animal{}


@Component
@Scope("prototype")
Class Cat extends Animal{}

AnimalFactory完成答案。

@Component
public class AnimalFactory implements BeanFactoryAware {

    private BeanFactory factory;

    public Animal create(String input) {
        if ("cat".equals(input) ) {
            return factory.getBean(Cat.class);

        } else if ("dog".equals(input) ) {
            return factory.getBean(Dog.class);
        }
    }

    public void setBeanFactory(BeanFactory beanFactory) {
        this.factory=beanFactory;
    }

}
于 2013-09-13T09:33:00.473 回答
0

除了 JB 的回答,您还可以使用基于 XML 的配置。以下也将起作用:

package com.example;

class PetOwner(){ 

 private Animal animal;

 public PetOwner() {
 };

 public void setAnimal(Animal animal) {
    this.animal = animal;
 }
}

使用以下 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"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<bean id="petOwner" class="com.example.PetOwner">
        <property name="animal" ref="animal" />
</bean>

<bean id="animal" class="com.example.pets.Dog" scope="prototype" />

每次对对象发出请求时,原型范围都会返回一个新实例。见http://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html

于 2013-09-13T09:07:08.900 回答