如何在加载时拦截EJB

时间:2013-08-22 12:57:15

标签: spring java-ee ejb cdi

我有几个EJB(用@Stateless注释)在我调用它们时加载(即它们不是 在我的应用程序服务器启动时急切加载。)

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

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

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

  • PS#1:首次调用EJB时​​调用@PostConstruct 可能是在我的AP启动后的某个时间。
  • PS#2:当我的EJB在JNDI上注册时是否抛出了一个事件?
  • PS#3:当你将它配置为扫描所有类时,Spring会做类似的事情 在包

1 个答案:

答案 0 :(得分: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。