我正在使用Spring开发Web应用程序。
我有一个共同的抽象类和许多实现。
现在,在控制器中,根据某些参数,我需要不同的实现。
使用Factory Pattern可以轻松实现。
例如:
abstract class Animal{
public abstract void run(){
}
}
class Dog extends Animal{
...
}
Class Cat extends Animal{
...
}
现在使用工厂模式,我可以使用工厂方法创建工厂类,该方法根据某些参数创建动物。 但我不想自己创建实例。
我需要相同的功能,但我希望Spring能够管理所有内容。因为不同的实现具有它们的依赖关系,我希望它们由Spring注入。
处理这种情况的最佳方法是什么?
答案 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