繁体   English   中英

使用Spring容器在非spring对象上调用方法,以允许参数接线吗?

[英]Invoke a method on a non-spring object with Spring container, allowing parameter wirings?

我有一个在容器外部创建的对象。 该对象具有一个方法accept(...) 请注意,这不是接口方法,因为参数的数量和类型未知。

总之,我也是Method中的accept()方法。

我想在Spring应用程序上下文中执行此方法,从而允许Spring在运行方法之前自动关联方法参数。

例:

public class MyCmd {
    public long accept(@AutoWire MyService service) {
    ...
    }
}

然后:

MyCmd cmd = new MyCmd();     // no spring here!
magicRunner.invoke(cmd);     // magic here

在这里,我希望能够运行accept() ,但要让Spring注入MyService作为方法的参数。

春天有这样的事情吗? 还是我必须手动执行所有这些操作?

我认为将反射和Spring自动装配通过方法参数混合起来几乎是不可能的,但是仍然有一种方法看起来与您要实现的目标等效(如果我正确理解的话)。

MyCmd可以在“原型”的范围进行登记AplicationContext 它将与其他现有的Spring Bean自动连接,但是每次在上下文中查找它时,都会返回一个新实例:

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Data
public class MyCmd {

  @Autowired
  private MyService myService;

  public long accept() {
    // ...
  }

}

现在,当您需要使用MyCmd

  @Autowired
  private ApplicationContext applicationContext;

  public void doMyThings() {
    MyCmd myCmd = applicationContext.getBean(MyCmd.class);
    // myCmd is a new ref each time, myService is autowired inside
    magicRunner.invoke(cmd);  
  }

是的,您可以在使用AspectJ的Spring中使用@Configurable来依赖注入域对象。

这是@Configurable上的文档。

构造函数DI的示例:

@Configurable
public class MyCmd {

    @Autowired
    public MyCmd(MyService service) {
      ...
    }
}

但要注意:从那时起,这是一个Spring管理的bean,因此您不能将其实例化为:

MyCmd cmd = new MyCmd();

但是,您必须像往常一样依赖注入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM