使用工厂创建spring托管bean



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

是否有一种方法可以让我在工厂类中创建的bean由Spring管理?或者工厂模式是错误的方法?

我是一个新手,所以如果需要更多的信息,请告诉我。

您可以定义一个连接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();
       }     
}

您不能使用@Autowired,因为bean的数量是可变的,但是您仍然可以使用ApplicationContextAware来创建获取bean。

如果bean的类型之前在配置中已经定义,那么您可以使用该方法从Java代码以编程方式创建原型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;
    }
}

最新更新