繁体   English   中英

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

[英]With Spring, how do I get a list of classes having a particular instance?

我尝试使用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定义。 有没有其他替代或改进的方法来获得。 提前致谢。

假设您要询问如何查找TestAware子类型

顾名思义, BeanPostProcessor仅从doc “处理” spring托管的bean:

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

因此,您在这里使用了错误的工具。 您可能应该使用一些反射来做您想要的事情,例如,使用Reflections

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

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

如果要在应用程序上下文中获取子类型的所有实例,那么查看它们就足够简单了:

@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中显式加载它们,或者通过类路径扫描隐式加载它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM