为了账号安全,请及时绑定邮箱和手机立即绑定

如何在应用程序上下文初始化事件中添加钩子?

如何在应用程序上下文初始化事件中添加钩子?

RISEBY 2019-11-28 13:07:07
对于常规的Servlet,我想您可以声明一个上下文侦听器,但是对于Spring MVC,Spring可以使此过程变得更容易吗?此外,如果定义了上下文侦听器,然后需要访问在servlet.xml或中定义的bean,我applicationContext.xml将如何访问它们?
查看完整描述

3 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

从Spring 4.2开始,您可以使用@EventListener(文档)


@Component

class MyClassWithEventListeners {


    @EventListener({ContextRefreshedEvent.class})

    void contextRefreshedEvent() {

        System.out.println("a context refreshed event happened");

    }

}


查看完整回答
反对 回复 2019-11-28
?
噜噜哒

TA贡献1784条经验 获得超7个赞

创建您的注释


  @Retention(RetentionPolicy.RUNTIME)

    public @interface AfterSpringLoadComplete {

    }

建立课程


    public class PostProxyInvokerContextListener implements ApplicationListener<ContextRefreshedEvent> {


    @Autowired

    ConfigurableListableBeanFactory factory;


    @Override

    public void onApplicationEvent(ContextRefreshedEvent event) {

        ApplicationContext context = event.getApplicationContext();

        String[] names = context.getBeanDefinitionNames();

        for (String name : names) {

            try {

                BeanDefinition definition = factory.getBeanDefinition(name);

                String originalClassName = definition.getBeanClassName();

                Class<?> originalClass = Class.forName(originalClassName);

                Method[] methods = originalClass.getMethods();

                for (Method method : methods) {

                    if (method.isAnnotationPresent(AfterSpringLoadComplete.class)){

                        Object bean = context.getBean(name);

                        Method currentMethod = bean.getClass().getMethod(method.getName(), method.getParameterTypes());

                        currentMethod.invoke(bean);

                    }

                }

            } catch (Exception ignored) {

            }

        }

    }

}

通过@Component注释或在xml中注册此类


<bean class="ua.adeptius.PostProxyInvokerContextListener"/>

并在环境初始化后要在任何要使用的方法上使用注解,例如:


   @AfterSpringLoadComplete

    public void init() {}


查看完整回答
反对 回复 2019-11-28
  • 3 回答
  • 0 关注
  • 473 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信