使用Spring,如何获取具有特定实例的类列表?

时间:2015-08-18 17:02:29

标签: java spring spring-mvc java-ee javabeans

我尝试过使用BeanPostProcessor

@Override
    public Object postProcessBeforeInitialization(final Object bean, final String beanName) throws BeansException
    {
        log.info("postProcessBeforeInitialization bean : " + beanName);
        if (bean instanceof TestAware)
        {
            testaware.add(((TestAware) bean).getClass());
            log.info("Added testAware bean : " + beanName);
        }
        return bean;
    }

但问题是,有一些类没有bean定义。 是否有任何替代方法或改进方法。 提前谢谢。

2 个答案:

答案 0 :(得分:0)

假设您在询问如何查找TestAware

的子类型

正如其名称所示,BeanPostProcessor仅从doc处理“处理”弹簧托管bean:

  

允许自定义修改新bean实例的工厂挂钩

所以你在这里使用了错误的工具。您可能应该使用一些反射来执行您想要的操作,例如,使用Reflections

// adapted from the home page sample
Reflections reflections = new Reflections("your.package");
Set<Class<? extends TestAware>> testAwares = reflections.getSubTypesOf(TestAware.class);

注意:上面的示例代码将为您提供子类型,而不是子类型的实例。

答案 1 :(得分:0)

如果您想在应用程序上下文中获取子类型的所有实例,那么查看它们很简单:

@Component
public class GetSubtypesOfClass implements ApplicationContextAware {

@Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        List<Subtype> matches = new ArrayList<>();
        for (String s : ac.getBeanDefinitionNames()) {
            Object bean = ac.getBean(s);
            if (Subtype.class.isAssignableFrom(bean.getClass())) {
                matches.add(bean);
            }
        }
    }
}

如果您想知道为什么您的子类型的实例未在应用程序上下文中可用,那么您需要在上下文xml中显式加载它们,或者通过类路径扫描隐式加载它们。