在运行时创建的对象中使用自动装配的bean

r15*_*abh 3 java spring autowired

我有一个实现W接口的B类.它有W方法的默认实现.类C和D覆盖默认实现,它们需要一个服务,其bean由spring实例化.字符串a和b来自用户,因此我无法提前创建B/C/D的bean.所以我有一个工厂,它根据用户参数创建一个新对象(它将根据参数创建B/C/D).是否有任何干净的方法我可以使用C和D内部的服务bean(aa/bb/cc/dd等)(服务器启动期间的弹簧自动装配,此时实例化B/C/D所需的参数不可用)或有没有更好的方法来解决这个问题?

 Class B implements W{
      String a;
      String b;
      B (String a, String b);

      w_method(){

      }
   }

    Class C extends B {
      @Autowired
      Service aa;

      @Autowired
      Service bb;

      @Autowired
      Service cc;

      @override
      w_method(){
      }
    }

Class D extends B {
  @Autowired
  Service dd;

  @override
  w_method(){
  }
}
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 7

有三种可能的方法:

  • 构造函数参数来自用户这一事实并不意味着Spring无法创建这些对象.

    您可以将它们声明为范围的Spring bean,prototype并在您的工厂中执行以下操作:

    public C createC(String a, String b) {
        return applicationContext.getBean("c", a, b);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法的缺点是你的工厂依赖ApplicationContext.

  • 您可以使用@Configurable并启用AspectJ编织来注释这些类.在这种情况下,Spring将配置这些类的对象,即使您使用它们创建它们new.请参见7.8.1使用AspectJ依赖于使用Spring注入域对象.

  • 您可以手动触发自动装配

    applicationContext.getAutowireCapableBeanFactory().autowireBean(...);
    
    Run Code Online (Sandbox Code Playgroud)

    当您无法控制需要自动装配的对象(servlet等)时,此方法很有用.


art*_*tol 6

我认为最简单的方法是将服务连接到工厂并在返回之前调用B/C/D对象上的setter,而不是尝试使用@Autowired.

或者使用axtavt的构造函数参数方法.如果你想避免依赖ApplicationContext,你可以使用Lookup Method Injection,但你必须根据这篇博文来修补Spring:http://nurkiewicz.blogspot.co.uk/2010/08/creating-prototype-spring-豆类,on.html