如何使用 Java 反射来创建 @Autowired class 的实例
How to use Java reflection to create an instance of an @Autowired class
我有一个 postgres 数据库,它存储(作为字符串)相关的 class 以根据来自用户的信息使用。
例如用户输入了 Name,数据库中存储了 NameFinder() 值,代码需要创建一个 NameFinder() 实例。
想知道有没有办法利用反射将这个class实例化为@Autowired组件,然后调用相关函数
我似乎找不到使用@Autowired classes 的指南,因此我们将不胜感激。
要使自动装配工作,您需要 class 将 @Autowired 用作 @Component(或 @Service 之类的子项 ...)。 https://www.baeldung.com/spring-autowire
为了Spring知道要注入什么,你需要在配置中定义一个@Bean
https://www.baeldung.com/spring-bean
关于bean中的反射实例化:
@Bean
public Name getName(Database db) {
String nameFqn = db.getConfigTable().getNameFQN();
return (Name) Class.forName(nameFqn).getConstructor().newInstance();
}
请注意,这使用了 no-arg public 构造函数。 FQN 表示 fully-qualified 名称,即 com.some.pkg.NameFinder
假设:
package com.some.pkg;
class NameFinder implements Name {
public NameFinder(){}
}
我觉得 Spring Bean 也应该可以直接从 FQN 配置而不使用反射,但我不知道如何配置。尝试阅读 BeanFactory 或类似的东西。通常反射是要避免的。
我有一个 postgres 数据库,它存储(作为字符串)相关的 class 以根据来自用户的信息使用。
例如用户输入了 Name,数据库中存储了 NameFinder() 值,代码需要创建一个 NameFinder() 实例。
想知道有没有办法利用反射将这个class实例化为@Autowired组件,然后调用相关函数
我似乎找不到使用@Autowired classes 的指南,因此我们将不胜感激。
要使自动装配工作,您需要 class 将 @Autowired 用作 @Component(或 @Service 之类的子项 ...)。 https://www.baeldung.com/spring-autowire
为了Spring知道要注入什么,你需要在配置中定义一个@Bean https://www.baeldung.com/spring-bean
关于bean中的反射实例化:
@Bean
public Name getName(Database db) {
String nameFqn = db.getConfigTable().getNameFQN();
return (Name) Class.forName(nameFqn).getConstructor().newInstance();
}
请注意,这使用了 no-arg public 构造函数。 FQN 表示 fully-qualified 名称,即 com.some.pkg.NameFinder
假设:
package com.some.pkg;
class NameFinder implements Name {
public NameFinder(){}
}
我觉得 Spring Bean 也应该可以直接从 FQN 配置而不使用反射,但我不知道如何配置。尝试阅读 BeanFactory 或类似的东西。通常反射是要避免的。