使用 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
仅 "processes" spring 个托管 bean,来自 doc:
Factory hook that allows for custom modification of new bean instances
所以你在这里使用了错误的工具。你可能应该使用一些反射来做你想做的事,例如,使用 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,或者通过类路径扫描隐式加载它们。
我试过使用 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
仅 "processes" spring 个托管 bean,来自 doc:
Factory hook that allows for custom modification of new bean instances
所以你在这里使用了错误的工具。你可能应该使用一些反射来做你想做的事,例如,使用 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,或者通过类路径扫描隐式加载它们。