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

对于常规的Servlet,我想您可以声明一个上下文侦听器,但是对于Spring MVC,Spring可以使此过程变得更容易吗?


此外,如果定义了上下文侦听器,然后需要访问在servlet.xml或中定义的bean,我applicationContext.xml将如何访问它们?


RISEBY
浏览 480回答 3
3回答

慕标5832272

从Spring 4.2开始,您可以使用@EventListener(文档)@Componentclass MyClassWithEventListeners {    @EventListener({ContextRefreshedEvent.class})    void contextRefreshedEvent() {        System.out.println("a context refreshed event happened");    }}

噜噜哒

创建您的注释&nbsp; @Retention(RetentionPolicy.RUNTIME)&nbsp; &nbsp; public @interface AfterSpringLoadComplete {&nbsp; &nbsp; }建立课程&nbsp; &nbsp; public class PostProxyInvokerContextListener implements ApplicationListener<ContextRefreshedEvent> {&nbsp; &nbsp; @Autowired&nbsp; &nbsp; ConfigurableListableBeanFactory factory;&nbsp; &nbsp; @Override&nbsp; &nbsp; public void onApplicationEvent(ContextRefreshedEvent event) {&nbsp; &nbsp; &nbsp; &nbsp; ApplicationContext context = event.getApplicationContext();&nbsp; &nbsp; &nbsp; &nbsp; String[] names = context.getBeanDefinitionNames();&nbsp; &nbsp; &nbsp; &nbsp; for (String name : names) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BeanDefinition definition = factory.getBeanDefinition(name);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String originalClassName = definition.getBeanClassName();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Class<?> originalClass = Class.forName(originalClassName);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Method[] methods = originalClass.getMethods();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (Method method : methods) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (method.isAnnotationPresent(AfterSpringLoadComplete.class)){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Object bean = context.getBean(name);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Method currentMethod = bean.getClass().getMethod(method.getName(), method.getParameterTypes());&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; currentMethod.invoke(bean);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } catch (Exception ignored) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }}通过@Component注释或在xml中注册此类<bean class="ua.adeptius.PostProxyInvokerContextListener"/>并在环境初始化后要在任何要使用的方法上使用注解,例如:&nbsp; &nbsp;@AfterSpringLoadComplete&nbsp; &nbsp; public void init() {}
打开App,查看更多内容
随时随地看视频慕课网APP