[英]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
来依赖注入域对象。
构造函数DI的示例:
@Configurable
public class MyCmd {
@Autowired
public MyCmd(MyService service) {
...
}
}
但要注意:从那时起,这是一个Spring管理的bean,因此您不能将其实例化为:
MyCmd cmd = new MyCmd();
但是,您必须像往常一样依赖注入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.