有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用Spring容器在非Spring对象上调用方法,允许参数连接?

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

无论如何,我还有accept()方法的Method

我希望在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作为方法的参数注入

春天有这样的天气吗?或者我必须手动完成所有这些


共 (2) 个答案

  1. # 1 楼答案

    我认为,通过方法参数混合反射和Spring自动连接是很难做到的,但仍然有一种方法看起来与您试图实现的方法相当(如果我正确理解的话)

    MyCmd可以在AplicationContext中的“原型”作用域中注册。它将与其他现有SpringBean自动连接,但每次在上下文中查找时都会返回一个新实例:

    @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);  
      }
    
  2. # 2 楼答案

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

    Here's the documentation on @Configurable.

    构造函数DI的示例:

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

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

    MyCmd cmd = new MyCmd();
    

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