当spring 容器初始化完成后,执行某个方法

82人阅读 评论(0) 收藏 举报
分类:

在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查。

比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,

并指出哪个文件的xml文件使用了这个函数。而在Spring的web项目中,我们可以介入Spring的启动过程。

我们希望在Spring容器将所有的Bean都初始化完成之后,做一些操作,这个时候我们就可以实现一个接口:

public class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> {
	@Override
	public void onApplicationEvent(ContextRefreshedEvent event) {
	//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
	}
}
同时在Spring的配置文件中,添加注入:
<!-- 当Spring容器启动完成后执行下面的这个Bean -->
<bean class="com.leadsoft.test.executor.processor.InstantiationTracingBeanPostProcessor"/>

但是这个时候,会存在一个问题,在web 项目中(spring mvc),系统会存在两个容器,

一个是root application context ,

另一个就是我们自己的 projectName-servlet context(作为root application context的子容器)。

这种情况下,就会造成onApplicationEvent方法被执行两次。

为了避免上面提到的问题,我们可以只在root application context初始化完成后调用逻辑代码,

其他的容器的初始化完成,则不做任何处理,修改后代码

@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
	//root application context 没有parent,他就是老大.
	if(event.getApplicationContext().getParent() == null){
	//需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。
	}
}

方法二、  

其实更简单的方法是使用注解:`@PostConstruct`,

只需要在需要启动的时候执行的方法上标注这个注解就搞定了,注意,还要在该类上加上@Component注解,否则不能执行。

注解描述如下:

package javax.annotation;
 
import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;
 
/**
 * The PostConstruct annotation is used on a method that needs to be executed
 * after dependency injection is done to perform any initialization. This
 * method MUST be invoked before the class is put into service. This
 * annotation MUST be supported on all classes that support dependency
 * injection. The method annotated with PostConstruct MUST be invoked even
 * if the class does not request any resources to be injected. Only one
 * method can be annotated with this annotation. The method on which the
 * PostConstruct annotation is applied MUST fulfill all of the following
 * criteria:
 * <p>
 * <ul>
 * <li>The method MUST NOT have any parameters except in the case of
 * interceptors in which case it takes an InvocationContext object as
 * defined by the Interceptors specification.</li>
 * <li>The method defined on an interceptor class MUST HAVE one of the
 * following signatures:
 * <p>
 * void <METHOD>(InvocationContext)
 * <p>
 * Object <METHOD>(InvocationContext) throws Exception
 * <p>
 * <i>Note: A PostConstruct interceptor method must not throw application
 * exceptions, but it may be declared to throw checked exceptions including
 * the java.lang.Exception if the same interceptor method interposes on
 * business or timeout methods in addition to lifecycle events. If a
 * PostConstruct interceptor method returns a value, it is ignored by
 * the container.</i>
 * </li>
 * <li>The method defined on a non-interceptor class MUST HAVE the
 * following signature:
 * <p>
 * void <METHOD>()
 * </li>
 * <li>The method on which PostConstruct is applied MAY be public, protected,
 * package private or private.</li>
 * <li>The method MUST NOT be static except for the application client.</li>
 * <li>The method MAY be final.</li>
 * <li>If the method throws an unchecked exception the class MUST NOT be put into
 * service except in the case of EJBs where the EJB can handle exceptions and
 * even recover from them.</li></ul>
 * @since Common Annotations 1.0
 * @see javax.annotation.PreDestroy
 * @see javax.annotation.Resource
 */
@Documented
@Retention (RUNTIME)
@Target(METHOD)
public @interface PostConstruct {
}
方法三、
方法实现InitializingBean或者ServletContextAware




查看评论

裸板调试方法合集

-
  • 1970年01月01日 08:00

当spring 容器初始化完成后执行某个方法

转自:http://blog.csdn.net/fatherican/article/details/9130165         在某些应用中,我们希望,当spring 容器将所有的be...
  • jueane
  • jueane
  • 2014-06-11 09:40:24
  • 4648

最佳实践--Spring容器初始化完成之后执行某个方法

最佳实践--Spring容器初始化完成之后执行某个方法
  • frankcheng5143
  • frankcheng5143
  • 2016-08-10 11:19:05
  • 1529

Spring容器初始化完之后执行某个方法

InitializingBean     Spirng的InitializingBean为bean提供了定义初始化方法的方式。InitializingBean是一个接口,它仅仅包含一个方法:...
  • u010523770
  • u010523770
  • 2016-12-14 10:57:19
  • 3917

spring容器加载完成执行某个方法

spring容器加载完成执行某个方法
  • angelwings_hao
  • angelwings_hao
  • 2014-09-09 10:13:51
  • 2430

【Spring实战】Spring容器初始化完成后执行初始化数据方法

一、背景知识在做WEB项目时,经常在项目第一次启动时利用WEB容器的监听、Servlet加载初始化等切入点为数据库准备数据,这些初始化数据是系统开始运行前必须的数据,例如权限组、系统选项、默认管理员等...
  • honghailiang888
  • honghailiang888
  • 2017-06-16 16:43:17
  • 8050

spring初始化、销毁容器时指定执行的方法

关于在spring  容器初始化 bean 和销毁前所做的操作定义方式有三种: 通过@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作 通过...
  • liuxiao723846
  • liuxiao723846
  • 2017-03-05 23:04:01
  • 2240

spring 容器初始化完成后执行某个方法

在某些应用中,我们希望,当spring 容器将所有的bean都初始化完成后,做一个操作(例如:将数据库中的字典,加载到内存中),这时我们可以实现一个接口,如下: [java] vie...
  • zzxuan6
  • zzxuan6
  • 2014-10-29 15:43:36
  • 322

spring 项目加载完立刻执行

我的目的是想在项目加载完毕之后,需要进行一些初始化的动作,比如从数据库查询数据,缓存起来等...
  • liuyifeng1920
  • liuyifeng1920
  • 2015-11-12 16:08:06
  • 15048

Spring MVC项目启动时在容器加载完毕后插入一个定时任务

在Spring MVC中,一般项目启动时容器会自动加载,但是平时任务开发中需要在项目启动时完成一件事,而这件事却使用到了容器里的内容,此时可通过实 ApplicationListener接口的方式实现...
  • l2421349002
  • l2421349002
  • 2017-05-09 09:27:05
  • 1515
    个人资料
    等级:
    访问量: 28万+
    积分: 4009
    排名: 9788
    最新评论