Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.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
使用Spring框架使用子类自动填充映射_Spring - Fatal编程技术网

使用Spring框架使用子类自动填充映射

使用Spring框架使用子类自动填充映射,spring,Spring,我有一个抽象类A和几个子类B、C、D,我想有一个映射,Spring自动将所有子类注入到映射中 我将从中创建许多子类,我不想在创建它们之后也填充XML,这样Spring就可以将它们放在一个映射中(它的双重工作和繁琐)。我希望Spring能够获取所有这些子类,并自动将它们放到地图中,而不需要庞大的XML 我知道对于映射,我需要为子类bean的每个实例提供一个键 到目前为止: 公共抽象类A{} @Bean(name=“Bbean”) 公共类B扩展了{} @Bean(name=“Cbean”) 公共类C

我有一个抽象类A和几个子类B、C、D,我想有一个映射,Spring自动将所有子类注入到映射中

我将从中创建许多子类,我不想在创建它们之后也填充XML,这样Spring就可以将它们放在一个映射中(它的双重工作和繁琐)。我希望Spring能够获取所有这些子类,并自动将它们放到地图中,而不需要庞大的XML

我知道对于映射,我需要为子类bean的每个实例提供一个键

到目前为止:
公共抽象类A{}
@Bean(name=“Bbean”)
公共类B扩展了{}
@Bean(name=“Cbean”)
公共类C扩展了{}
@Bean(name=“Dbean”)

公共类D扩展了{}
好的,您希望bean自动检测,然后自动收集它们
因此,用@Component-like注释(例如@Component、@Service、@Repository、@Controller等)来注释B、C、D类,然后使用@ComponentScan来检测它们。(@Bean用于其他目的,您在示例中没有正确使用它)
然后使用@Autowired annotation:
收集类型A的所有bean

@Autowired List<A> allAs;
最后,从@Autowired列表创建一个映射:

class AsMapHolder implements InitializingBean {
    @Autowired private List<A> allAs;
    private Map<String, A> nameToA = new LinkedHashMap<String, A>();
    @Override void afterPropertiesSet() {
        for (A a: allAs) {
            nameToA.put(a.getName(), a); //getName() is from BeanNameAware, populated automatically
        }
    }
}
类AsMapHolder实现初始化bean{ @自动连线私人列表; 私有映射名toa=新LinkedHashMap(); @重写void afterPropertieSet(){ 为了(A:allAs){ nameToA.put(a.getName(),a);//getName()来自BeanNameware,自动填充 } } } 它应该会起作用


更新:只需“@自动连线地图beanNameToA“也可以

你真的需要地图吗?对于一个列表,这只是工作。还没有使用映射进行自动关联。为什么要这样做?谢谢它成功了,我只是在想,如果你能像你那样用一行代码自动关联一个列表,当然你可以根据我的要求自动关联一个映射,而不需要你写的所有样板代码。我没有足够的信誉来投票支持你。问题是你为什么需要它。看起来您创建了另一个小Spring容器。注意,您总是可以从Spring应用程序上下文中通过名称获取任何bean,只需让您的bean实现ApplicationContextAware接口即可。
class AsMapHolder implements InitializingBean {
    @Autowired private List<A> allAs;
    private Map<String, A> nameToA = new LinkedHashMap<String, A>();
    @Override void afterPropertiesSet() {
        for (A a: allAs) {
            nameToA.put(a.getName(), a); //getName() is from BeanNameAware, populated automatically
        }
    }
}