Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过BeanFactory.getBean(Class<;T>;)检索泛型bean_Java_Spring_Generics - Fatal编程技术网

Java 通过BeanFactory.getBean(Class<;T>;)检索泛型bean

Java 通过BeanFactory.getBean(Class<;T>;)检索泛型bean,java,spring,generics,Java,Spring,Generics,使用Spring4.x,我可以轻松地自动连接通用bean,并让Spring安全地找到它,即使容器bean是通用的 例如,以下工作(参见) 类MyBean{ @自动连线 私家道道; } 类MyBean{ @自动连线 私家道道; } 但是,有时我需要在方法执行期间在运行时检索bean,而不是依赖于自动连接(例如,在上下文初始化期间bean可能还没有准备好) private myCode(){ BeanFactory BeanFactory;//或可配置列表BeanFactory Dao-Dao=b

使用Spring4.x,我可以轻松地自动连接通用bean,并让Spring安全地找到它,即使容器bean是通用的

例如,以下工作(参见)

类MyBean{
@自动连线
私家道道;
}
类MyBean{
@自动连线
私家道道;
}
但是,有时我需要在方法执行期间在运行时检索bean,而不是依赖于自动连接(例如,在上下文初始化期间bean可能还没有准备好)

private myCode(){
BeanFactory BeanFactory;//或可配置列表BeanFactory
Dao-Dao=beanFactory.getBean(..);
}
考虑事项:

  • getBean接受bean名称和/或类型参数。在运行时,我可以知道或不知道bean的名称
  • 类解析为Dao的任何通用实现(例如Dao和Dao)
问题是:

如何调用BeanFactory来获取绑定到给定类型的bean实例?
相关:我知道Spring的
RestTemplate
需要一个参数化的TypeReference,当您需要将调用绑定到
List
(当您知道T时)的返回类型时,下面的解决方法是有效的。但是,我不会接受我的答案,因为变通方法缺乏可读性,并且受到未经检查的强制转换的影响

String[] names = beanFactory.getBeanNamesForType(ResolvableType.forClassWithGenerics(Dao.class, Entity.class));
Dao<Entity> dao = beanFactory.getBean(names[0], Dao.class);
String[]names=beanFactory.getBeanNamesForType(ResolvableType.forclasswith泛型(Dao.class,Entity.class));
Dao-Dao=beanFactory.getBean(名称[0],Dao.class);

理由:Spring允许获取参数化类型的bean名称。在第一个调用只返回一个结果的假设下,第二个调用通过返回该bean来工作。不幸的是,第二个调用生成了编译器时间警告,因为Spring版本4.X.X您只需自动连接
ApplicationContext
,因为它现在实现了
BeanFactory
接口。例如:

@Component     
public class BeanUtil {

    @Autowired
    private ApplicationContext applicationContext;     
    
    public Parent get() {
        ResolvableType resolvableType = ResolvableType.forClassWithGenerics(Parent.class, ResolvableType.forClass(Child.class));
        String[] beanNames = applicationContext.getBeanNamesForType(resolvableType);
        assert beanNames.length == 1;
        String beanName = beanNames[0];
        Parent parent = applicationContext.getBean(beanName, Parent.class);
        return parent;
    }         

}

因缺乏更好的回答而被接受,罚款+1。似乎没有更好的选择。
String[] names = beanFactory.getBeanNamesForType(ResolvableType.forClassWithGenerics(Dao.class, Entity.class));
Dao<Entity> dao = beanFactory.getBean(names[0], Dao.class);
@Component     
public class BeanUtil {

    @Autowired
    private ApplicationContext applicationContext;     
    
    public Parent get() {
        ResolvableType resolvableType = ResolvableType.forClassWithGenerics(Parent.class, ResolvableType.forClass(Child.class));
        String[] beanNames = applicationContext.getBeanNamesForType(resolvableType);
        assert beanNames.length == 1;
        String beanName = beanNames[0];
        Parent parent = applicationContext.getBean(beanName, Parent.class);
        return parent;
    }         

}