用工厂创建spring managed managed bean

时间:2014-08-22 00:06:36

标签: spring autowired factory-pattern

我有一个spring应用程序,我试图注入许多相同类型的bean。我不知道在运行之前会有多少这些bean,所以使用工厂模式似乎很自然,因为我无法在我的java配置类中配置每个bean。但是,这些bean需要将一些字段连接到Spring,当我在工厂中使用“new”创建它们时,它们当然不是Spring管理的。

有没有办法让我在工厂类中创建的bean由Spring管理?或者工厂模式是错误的做法?

我发布时相当新,所以如果有必要提供更多信息,请告诉我。

2 个答案:

答案 0 :(得分:1)

由于bean的数量可变,您无法使用@Autowired,但您仍然可以使用ApplicationContextAware来创建获取bean。

使用它可以从Java代码中以编程方式创建原型bean,如果之前已在配置中定义了bean的类型,或者您可以使用new在工厂中创建新对象,然后使用此设置依赖项同样的方法。

这是一个实现的例子:

public final class ApplicationContextProvider implements ApplicationContextAware {

    private static ApplicationContext CONTEXT;

    public void setApplicationContext(ApplicationContext context) throws BeansException {
        CONTEXT = context;
    }

    public static Object getBean(String beanName) {
        return CONTEXT != null ? CONTEXT.getBean(beanName) : null;
    }

    public static <T> T getBean(Class<T> objectClass) {
        return CONTEXT != null ? CONTEXT.getBean(objectClass) : null;
    }
}

答案 1 :(得分:1)

您可以定义与bean所需的依赖关系连接的beanFactory,然后在beanFactory创建的每个新bean中手动注入它们。例如:

public class MyBean { 

   private Dependency1 dep1;
   private Dependency2 dep2;

   public MyBean(Dependency1 dep1, Dependency2 dep2) { 
      this.dep1 = dep1;
      this.dep2 = dep2;
   }
} 

@Component
public class MyBeanFactory {

    @Autowired 
    private Dependency1 dep1;

    @Autowired 
    private Dependency2 dep2;


    public MyBean createInstance() {
       return new MyBean(dep1, dep2);
    }      
}


@Component
public class MyBeanConsumer {
      @Autowired
      private MyBeanFactory myBeanFactory;


       public void foo() {                  
           final MyBean bean = myBeanFactory.createInstance();
       }     
}