0

我有一些 EJB(用@Stateless 注释)在我调用它们时加载(即,当我的应用程序服务器启动时它们不会急切地加载)。

其中一些包含自定义方法注释,我们称之为@Foo。

我想找到一种方法来在我的应用程序服务器 (AS) 启动时扫描所有这些,并找到哪些用 @Foo 注释。

到目前为止,我已经在 web.xml 中注册了一个在 AS 启动时调用的生命周期侦听器。

  • PS#1:@PostConstruct 在我的 EJB 首次被调用时被调用,这可能是在我的 AP 启动后的稍后时间。
  • PS#2:当我的 EJB 在 JNDI 上注册时是否会引发事件?
  • PS#3:当您将 Spring 配置为扫描包下的所有类时,我认为 Spring 会做类似的事情
4

1 回答 1

0

如果 EJB 是由 Spring 构建的,那么您可以使用 Spring bean 后处理器(这是 Spring 在执行扫描时使用的)。

@Component
public class FooFinder implements BeanPostProcessor {

    List<Method> fooMethods = new ArrayList<>();

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        Class<?> targetClass = AopUtils.getTargetClass(bean);
        for (Method method : targetClass.getDeclaredMethods()){
            for (Annotation annotation : AnnotationUtils.getAnnotations(method)){
                if (annotation instanceof Foo){
                    fooMethods.add(method);
                }
            }
        }
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

还要注意...小心将依赖项注入到您的 BeanPostProcessor 中。您可能会在 Spring 依赖关系图中产生问题,因为必须首先创建 BeanPostProcessors。如果您需要向其他 bean 注册该方法,请创建 BeanPostProcessor ApplicationContextAware 或 BeanFactoryAware,然后以这种方式获取 bean。

于 2013-08-22T16:15:01.753 回答