Java Spring Boot-如何获得一个用@Service by it';姓名
我对spring很陌生(从PHP切换到Java) 在我的代码中,我有一个Java Spring Boot-如何获得一个用@Service by it';姓名,java,spring,spring-boot,dependency-injection,Java,Spring,Spring Boot,Dependency Injection,我对spring很陌生(从PHP切换到Java) 在我的代码中,我有一个java.lang.reflect.Method对象,我需要用它的所有依赖项实例化它的类 通常我会在代码中使用@Autowired注释,但这是不可能的,因为我的代码得到的是不同的方法对象,而不是特定的类 问题是-如何从依赖项容器中获取一个类实例,而不使用注释和只有类名 在php中,我使用了允许我访问容器的库,我可以通过它的类名获得DI服务,就像: $this->container->get('My\Class\N
java.lang.reflect.Method
对象,我需要用它的所有依赖项实例化它的类
通常我会在代码中使用@Autowired
注释,但这是不可能的,因为我的代码得到的是不同的方法对象,而不是特定的类
问题是-如何从依赖项容器中获取一个类实例,而不使用注释和只有类名
在php中,我使用了允许我访问容器的库,我可以通过它的类名获得DI服务,就像:
$this->container->get('My\Class\Name');
春天,我试着:
@Autowired
private ApplicationContext context;
void myMethod(Method method){
this.context.getBean(method.getClass());
及
这导致了NullPointerException
编辑
感谢您的快速回复
我试着用
context.getBean(method.getDeclaringClass());
及
这两种情况都会导致NullPointerException
实际上,我需要按类或按名称获取该类是可以的。我正在尝试为CQR编写自己的命令总线。
让我向您展示一些代码:
处理程序:
public class SimpleCommandBus implements CommandBus {
@Autowired
private ApplicationContext context;
private Map<Class, Method> registry = new HashMap<>();
@Override
public void register(Class c, Method o) {
registry.put(c, o);
}
@Override
public void dispatch(Object command) {
if (!registry.containsKey(command.getClass())) {
throw new CommandDispatchException(String.format("Handler for command %s was not defined.", command));
}
Method method = registry.get(command.getClass());
Object handler = context.getBean(method.getDeclaringClass().getSimpleName());//line causing exception
调用命令总线:
Method method = TestHandler.class.getMethod("handle", TestCommand.class);
TestCommand command = new TestCommand("Test command");
commandBus.register(TestCommand.class, method);
commandBus.dispatch(command);
用于查找在哪个类中声明给定方法method.getClass()
将返回method
对象的类型,即java.lang.reflect.method
@Autowired
AplicationContext ctx;
...
Object bean = ctx.getBean(method.getDeclaringClass());
用于查找在哪个类中声明给定方法method.getClass()
将返回method
对象的类型,即java.lang.reflect.method
@Autowired
AplicationContext ctx;
...
Object bean = ctx.getBean(method.getDeclaringClass());
在Spring中,默认名称是简单名称 另外,正如在Karols answer中一样,您必须使用getDeclaringClass()通过该方法获取类的类 所以你必须打电话
this.context.getBean(method.getDeclaringClass().getSimpleName());
在Spring中,默认名称是简单名称 另外,正如在Karols answer中一样,您必须使用getDeclaringClass()通过该方法获取类的类 所以你必须打电话
this.context.getBean(method.getDeclaringClass().getSimpleName());
这也可能有效,但问题是“按名称获取”,不幸的是,这不起作用。我在编辑中添加了一些有问题的代码clarify@MateuszWuSpring将为bean生成代理,例如支持
@Transactional
。method.getDeclaringClass().getSimpleName()返回什么?System.err.println(method.getDeclaringClass().getSimpleName());返回“TestHandler”@KarolDowbeckiIn addition-我还检查了是否可以自动连接该服务(TestHandler),以确保spring DI可以看到它并且它可以完美地工作。这可能也可以工作,但问题是“按其名称获取…”不幸的是,这不起作用。我在编辑中添加了一些有问题的代码clarify@MateuszWuSpring将为bean生成代理,例如支持@Transactional
。method.getDeclaringClass().getSimpleName()返回什么?System.err.println(method.getDeclaringClass().getSimpleName());返回“TestHandler”@KarolDowbeckiIn addition-我还检查了是否可以自动连接该服务(TestHandler),以确保spring DI可以看到它并且它可以完美地工作。不幸的是,这不起作用。我已经添加了一些有问题的代码编辑来澄清你能不能添加你得到的异常的stacktrace?不幸的是,这不起作用。我添加了一些有问题的代码编辑来澄清问题,你能添加你得到的异常的stacktrace吗?
this.context.getBean(method.getDeclaringClass().getSimpleName());