依赖注入,需要像工厂一样的功能

时间:2013-09-13 08:53:51

标签: java spring dependency-injection

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

我有一个共同的抽象类和许多实现。

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

使用Factory Pattern可以轻松实现。

例如:

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

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

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

我需要相同的功能,但我希望Spring能够管理所有内容。因为不同的实现具有它们的依赖关系,我希望它们由Spring注入。

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

3 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分: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;
    }

}

答案 2 :(得分:0)

除了JB的答案,您还可以使用基于XML的配置。以下内容也适用:

package com.example;

class PetOwner(){ 

 private Animal animal;

 public PetOwner() {
 };

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

使用以下xml-config:

<?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" />

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