Spring-MVC的應用中,要實現類似的功能,主要是通過實現下面這些接口(任選一,至少一個即可)
一、ApplicationContextAware接口
|
1
2
3
4
5
6
7
8
9
|
package
org.springframework.context;
import
org.springframework.beans.BeansException;
import
org.springframework.beans.factory.Aware;
import
org.springframework.context.ApplicationContext;
public
interface
ApplicationContextAware
extends
Aware {
void
setApplicationContext(ApplicationContext var1)
throws
BeansException;
}
|
二、ServletContextAware 接口
|
1
2
3
4
5
6
7
8
|
package
org.springframework.web.context;
import
javax.servlet.ServletContext;
import
org.springframework.beans.factory.Aware;
public
interface
ServletContextAware
extends
Aware {
void
setServletContext(ServletContext var1);
}
|
三、InitializingBean 接口
|
1
2
3
4
5
|
package
org.springframework.beans.factory;
public
interface
InitializingBean {
void
afterPropertiesSet()
throws
Exception;
}
|
四、ApplicationListener<ApplicationEvent> 接口
|
1
2
3
4
5
6
7
8
|
package
org.springframework.context;
import
java.util.EventListener;
import
org.springframework.context.ApplicationEvent;
public
interface
ApplicationListener<E
extends
ApplicationEvent>
extends
EventListener {
void
onApplicationEvent(E var1);
}
|
示例程序:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
package
test.web.listener;
import
org.apache.logging.log4j.*;
import
org.springframework.beans.*;
import
org.springframework.beans.factory.InitializingBean;
import
org.springframework.context.*;
import
org.springframework.context.event.ContextRefreshedEvent;
import
org.springframework.stereotype.Component;
import
org.springframework.web.context.ServletContextAware;
import
javax.servlet.ServletContext;
@Component
public
class
StartupListener
implements
ApplicationContextAware, ServletContextAware,
InitializingBean, ApplicationListener<ContextRefreshedEvent> {
protected
Logger logger = LogManager.getLogger();
@Override
public
void
setApplicationContext(ApplicationContext ctx)
throws
BeansException {
logger.info(
"1 => StartupListener.setApplicationContext"
);
}
@Override
public
void
setServletContext(ServletContext context) {
logger.info(
"2 => StartupListener.setServletContext"
);
}
@Override
public
void
afterPropertiesSet()
throws
Exception {
logger.info(
"3 => StartupListener.afterPropertiesSet"
);
}
@Override
public
void
onApplicationEvent(ContextRefreshedEvent evt) {
logger.info(
"4.1 => MyApplicationListener.onApplicationEvent"
);
if
(evt.getApplicationContext().getParent() ==
null
) {
logger.info(
"4.2 => MyApplicationListener.onApplicationEvent"
);
}
}
}
|
運行時,輸出的順序如下:
1 => StartupListener.setApplicationContext
2 => StartupListener.setServletContext
3 => StartupListener.afterPropertiesSet
4.1 => MyApplicationListener.onApplicationEvent
4.2 => MyApplicationListener.onApplicationEvent
4.1 => MyApplicationListener.onApplicationEvent
注意:onApplicationEvent方法會觸發多次,初始化這種事情,越早越好,建議在setApplicationContext方法中處理。
最后一步別忘了,在spring-config.xml中加入自定義的bean,如下面的例子:
<!--初始化操作的bean 在spring初始化完成的時候執行這個操作 --> <bean class="com.**.firm.fclient.web.listener.ApplicationContextListener"/>
此外還有一種方法:
寫個BEAN,將要執行的操作寫在構造函數里,在將這個類配置到XML里,比如配置到SPRING-MVC.XML里 <bean class="com.test.xx"> 自己的類
不過不推薦使用這種方法
